web-dev-qa-db-ja.com

mingw-w64スレッド:posix vs win32

Windowsにmingw-w64をインストールしていますが、2つのオプションがあります。win32スレッドとposixスレッドです。 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スレッドは引き続き使用されます。しかし、何によって使用されますか?

97
Simon

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を呼び出すユーザーコードには影響しません。常に両方を使用できます。

95
rubenvb

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

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

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

15

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

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

11
Tom 7