1. ホーム
  2. windows

[解決済み] mingw-w64スレッド:PosixとWin32の比較

2022-02-27 01:16:57

質問

Windowsにmingw-w64をインストールしているのですが、win32 threadsとposix threadsという2つのオプションがあります。win32スレッドとpthreadsの違いは分かっているのですが、この2つのオプションの違いがよく分かりません。posix threadsを選択すると、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にはコンパイラ・ランタイム・ライブラリ(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を配布することは何も問題ありません。
  • win32 : C++11のマルチスレッド機能はありません。

Win32 API や pthreads API を呼び出すユーザーコードには、どちらも影響を与えません。あなたは常に両方を使用することができます。