C ++でスレッドやプロセス識別子(string、int、...)を取得する移植可能な方法はありますか?
8 に答える
いくつかの方法がありますが、すべてがスレッドを抽象化する外部ライブラリの使用を意味します。
人気のある選択肢の中で、2つは次のとおりです。
- Boost.Threadライブラリ。これは最も移植性が高いですが、巨大なライブラリであるBoostで動作することを意味します
- Qtライブラリ。これは移植性が低く、大きなライブラリであるQtで動作することを意味します。
これらの2つのライブラリですでにいずれかを使用している場合は、それを使用することをお勧めします。それ以外の場合は、それらが提供する他のツールを調べて選択します。
移植可能とは、C++ コンパイラが存在するすべてのプラットフォームで機能する方法を意味する場合、移植可能な方法はありません。そのような方法は C++ 標準の一部である必要があり、その場合、実際にはどこでも機能します (C++ 標準の他の部分がどこでも機能するように)。プラットフォームがこの標準をサポートすると述べていない限り、標準にないものはすべて、どのプラットフォームでも動作することが保証されているわけではありません。
ここで人々が提案したすべてのソリューションは、外部ライブラリを使用するソリューションであるため、そのライブラリでサポートされているプラットフォームでのみ機能します。また、既存のすべてのプラットフォームで使用できるライブラリはありません。
おそらく最も遠いのは POSIX です。すべての UNIX ライクなシステムは、少なくとも一部の POSIX をサポートしようとしますが (多ければ多いほど良い)、実際に 100% POSIX 準拠のプラットフォーム (A/UX、 AIX、HP-UX、IRIX、Mac OS X 10.5、MINIX、QNX、Solaris、UnixWare、VxWorks など、いくつか例を挙げると、もちろん他にもあります)。ただし、少なくとも一部の POSIX サポートを提供するプラットフォーム、多かれ少なかれサポートするプラットフォーム、ほぼ POSIX に準拠しているもの (FreeBSD、Linux、NetBSD、BeOS、OpenBSD など) はかなりの数あります。
残念ながら、Windows は 1 つにはほど遠いものです。NT は以前は部分的に POSIX に準拠していましたが、現在では多かれ少なかれ姿を消しました (Win2000/20003、WinXP、および Vista は引き続き POSIX エミュレート モードに設定でき、Microsoft Windows Services for UNIX をインストールすることで一部の POSIX 呼び出しを内部 API 呼び出しに変換できます)。 - SFU 3.5 以降)、ただし、外部ライブラリを介して Windows で一部の POSIX 機能を取得する方法もあります (Cygwin は、Windows でかなりの量の POSIX 機能を有効にするためにアプリとリンクできる LGPL ライブラリを提供します)。
POSIX の利点は、比較的普及していることだけでなく、標準化されており、インターネットで標準を簡単に調べることができることです。POSIX 呼び出しを使用すると、スレッド ID とプロセス ID を取得できます。
プラットフォームに依存しないラッパーを実装するACEライブラリの一部を使用することもできます。PIDの検索は、ライブラリ内のファイルの1つです(おそらくACE_Process / ACE_Thread)。
私はいつもスレッドはC++の外部にあると思っていました。Javaには、言語に組み込まれたネイティブスレッドがあります。
ポータブルスレッドライブラリを見つける必要があります。
唯一の方法は、ポータブル ライブラリを使用することです。Qt (GUI アプリである必要はありません) またはwxWidgetsをお勧めします。ゲームを開発している場合は、SDLをチェックしてください
また、何かがあるかもしれないブーストライブラリもチェックしてください。
それらがどれほど移植性があるかはわかりませんが、Posix スレッドも検討したい別のオプションかもしれません。こちらもご覧ください。スティーブのコメントに同意します-どのプラットフォームに移植できますか?
getpid() は、プロセス ID を取得する移植可能な方法です。
ラッパー ライブラリを使用しない限り、移植可能なメソッドを見つけることはできないと思います。各スレッド システム (Windows や POSIX など) には、独自のメカニズムがあります。