165

Windows に mingw-w64 をインストールしていますが、win32 スレッドと posix スレッドの 2 つのオプションがあります。win32 スレッドと pthread の違いはわかりますが、これら 2 つのオプションの違いはわかりません。posix スレッドを選択すると、CreateThread などの WinAPI 関数を呼び出せなくなるとは思えません。

このオプションは、プログラムやライブラリがどのスレッド API を使用するかを指定しているように見えますが、何によって使用されるのでしょうか? GCC、libstdc++、または他の何かによるものですか?

私はこれを見つけました: Windowsのgccポートでのthread_posixsとthread_win32の違いは何ですか?

つまり、このバージョンの mingw では、threads-posix リリースは posix API を使用して std::thread の使用を許可し、threads-win32 は win32 API を使用し、std::thread の部分を無効にします。標準。

わかりました。win32 スレッドを選択すると、std::thread は使用できなくなりますが、win32 スレッドは引き続き使用されます。しかし、何によって使用されますか?

4

4 に答える 4

160

GCC にはコンパイラ ランタイム ライブラリ (libgcc) が付属しており、サポートする言語でマルチスレッド関連の機能に低レベルの OS 抽象化を提供するために (とりわけ) 使用されます。最も関連性の高い例は libstdc++ の C++11 <thread><mutex>、および<future>であり、GCC がその内部 Win32 スレッド モデルで構築されている場合、完全な実装はありません。MinGW-w64 は winpthreads (Win32 マルチスレッド API 上の pthreads 実装) を提供し、GCC はこれをリンクしてすべての高度な機能を有効にすることができます。

このオプションは、必要なコードを書くことを禁止するものではないことを強調しなければなりません (コードで呼び出すことができる API にはまったく影響しません) GCC のランタイム ライブラリ (libgcc/libstdc++/...) が機能に使用するもののみを反映しています。@James が引用した警告は、GCC の内部スレッド モデルとは関係なく、Microsoft の CRT 実装とは関係ありません。

要約する:

  • posix: C++11/C11 マルチスレッド機能を有効にします。libgcc を libwinpthreads に依存させます。これにより、pthreads API を直接呼び出さなくても、winpthreads DLL を配布することになります。アプリケーションで DLL をもう 1 つ配布しても問題はありません。
  • win32: C++11 マルチスレッド機能はありません。

どちらも、Win32 API または pthreads API を呼び出すユーザー コードには影響しません。常に両方を使用できます。

于 2015-05-22T07:00:24.457 に答える
19

GCC ランタイムの一部 (特に例外処理) は、使用されているスレッド モデルに依存します。そのため、POSIX スレッドでビルドされたバージョンのランタイムを使用しているが、Win32 API を使用して独自のコードでスレッドを作成することにした場合、ある時点で問題が発生する可能性があります。

ランタイムの Win32 スレッド バージョンを使用している場合でも、おそらく Win32 API を直接呼び出すべきではありません。MinGW FAQからの引用:

MinGW は Windows に付属する標準の Microsoft C ランタイム ライブラリを使用するため、注意して正しい関数を使用して新しいスレッドを生成する必要があります。特に、CreateThread関数は C ランタイム ライブラリのスタックを正しくセットアップしません。代わりに使用する必要があります_beginthreadex。これは、(ほぼ) と完全に互換性がありCreateThreadます。

于 2013-06-22T19:13:49.317 に答える
14

win32 スレッド モードで C++11 std::thread の一部を使用できるようになったことに注意してください。これらのヘッダーのみのアダプターは、すぐに使用できました: https://github.com/meganz/mingw-std-threads

改訂履歴から、これを mingw64 ランタイムの一部にしようとする最近の試みがあるようです。

于 2015-09-19T15:32:58.217 に答える