mingw-w64スレッド:posix vs win32


127

私は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部分を無効にします標準。

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


この gcc を使用して作成されたアプリケーションによって使用されます。
devnull 2013年

@devnull、これは私が使用するAPIによって決定されませんか?MinGWのpthreadsバージョンを選択すると、WinAPIをスレッドに使用できなくなるのはなぜですか?
Simon

gccはあなたを妨げるか、むしろ不安定になります
jiggunjer

回答:


122

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

私は(それは絶対にしているあなたが望む任意のコードを書くために禁止されません、このオプションを強調しなければならないNO、あなたのコード内で呼び出すことができますどのような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を呼び出すユーザーコードには影響しません。いつでも両方を使用できます。


7
いつでもgccランタイムとwinpthreadsを静的にリンクできるため、DLLを含める必要がなくなります。
Alexander Shishenko、2015年

3
それはとても場合には、それは他の誰かを助け、Linux上で対応するオプションを見つけるために、私はしばらく時間がかかった:パッケージには、g++-mingw-w64-x86-642つのファイルを提供x86_64-w64-mingw32-g++-win32してx86_64-w64-mingw32-g++-posix、およびx86_64-w64-mingw32-g++それらのいずれかにエイリアスされます。参照してくださいupdate-alternatives --display x86_64-w64-mingw32-g++
stewbasic

うーん、あなたは言う...「GCCが内部のWin32スレッドモデルで構築されている場合、完全な実装はありません。次にリンクして、すべての機能を有効にします。」win32モデルを選択した場合、GCCはwinpthreadsを使用するため、すべての機能を有効にできますか?しかし、以下の箇条書きでは、「win32:C ++ 11マルチスレッド機能なし」と記述しています。わかりません。「どのGCCが次にリンクできるか」とは、win32を選択しない場合に選択できるということですか?
ヨハネスシャウブ-litb

@ JohannesSchaub-litbそうですね。GCCの構成マジックは、内部スレッドモデルの選択をlibstdc ++の有効な機能に結合します。後者は、GCCの内部「gthread」ラッパー(薄いposixのようなスレッドの抽象化です)の上に構築されているためです。C++ 11機能の基本的な部分はありませんあなたが使用している層に--threads=win32。行方不明のビットがGCCで実装されていないように限り、あなたがGCCを設定する必要があります--threads=win32
rubenvb

-win32を使用するqtのmingwプリコンパイル済みライブラリを、-posixを使用する他のライブラリと共に使用し、同じプログラムで両方のライブラリを使用できますか?
Johannes Schaub-litb

16

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

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

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


7
この場合、boostやQtなどのサードパーティのスレッドライブラリはどうですか?これらのライブラリを基盤となるスレッドライブラリを把握する必要なしにmingw64で使用する方法はありますか?mingwのposixバリアントでboost :: threadsを使用することを任意に決定するとどうなりますか?
タントゥニ2014年

1
@ user460153いくつかの情報qt-project.org/wiki/…–
Alex V.

10
この答えは間違っています。GCCランタイムは、Win32 APIにまったく影響を与えません。
rubenvb 2015年

リンクされたFAQエントリを読んでください。この答えは正しいです。
Daira Hopwood

13

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.