mingw-w64主题:posix vs win32

Sim*_*mon 103 windows gcc mingw pthreads

我正在Windows上安装mingw-w64,有两个选项:win32线程和posix线程.我知道win32线程和pthreads之间的区别是什么,但我不明白这两个选项之间的区别.我怀疑如果我选择posix线程,它将阻止我调用WinTI函数,如CreateThread.

看来这个选项指定某些程序或库将使用哪个线程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线程.但用什么?

rub*_*nvb 100

GCC附带了一个编译器运行时库(libgcc),它用于(除其他外)为其支持的语言中的多线程相关功能提供低级OS抽象.最相关的例子是的libstdc ++的C++ 11 <thread>,<mutex><future>,不具有完全实现时,GCC在其内部的Win32线程模型建立.MinGW-w64提供了一个winpthreads(在Win32多线程API之上的pthreads实现),GCC可以将其链接到其中以启用所有奇特的功能.

我必须强调这个选项并不禁止你编写你想要的任何代码(它对你可以在代码中调用的API 完全没有影响).它只反映了GCC的运行时库(libgcc/libstdc ++/...)用于其功能.@James引用的警告与GCC的内部线程模型无关,而是与微软的CRT实现有关.

总结一下:

  • posix:启用C++ 11/C11多线程功能.使libgcc依赖于libwinpthreads,这样即使你不直接调用pthreads API,你也会分发winpthreads DLL.在您的应用程序中再分发一个DLL没有任何问题.
  • win32:没有C++ 11多线程功能.

对调用Win32 API或pthreads API的任何用户代码都没有影响.你可以随时使用两者.

  • 您始终可以静态链接gcc运行时和winpthreads,从而消除了DLL包含的必要性. (7认同)
  • 我花了一些时间在Linux上找到相应的选项,以防万一它帮助别人:包`g ++ - mingw-w64-x86-64`提供两个文件`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 ++`. (3认同)
  • 嗯,你说“...当 GCC 使用其内部 Win32 线程模型构建时,它没有完整的实现...MinGW-w64 提供了 winpthreads(Win32 多线程 API 之上的 pthreads 实现),GCC 可以使用它然后链接以启用所有奇特的功能。” 那么如果我选择 win32 模型,GCC 仍然可以启用所有功能,因为它使用了 winpthreads?但在下面的项目符号中,您写了“win32:没有 C++11 多线程功能”。我不明白。“哪个 GCC 可以链接到...”是否意味着如果我*不*选择 win32,那么它可以选择...? (3认同)

Jam*_*ess 15

GCC运行时的部分(特别是异常处理)取决于所使用的线程模型.因此,如果您使用的是使用POSIX线程构建的运行时版本,但决定使用Win32 API在您自己的代码中创建线程,那么您可能在某些时候遇到问题.

即使您使用的是运行时的Win32线程版本,也可能不应该直接调用Win32 API.引自MinGW FAQ:

由于MinGW使用Windows附带的标准Microsoft C运行时库,因此您应该小心并使用正确的函数来生成新线程.特别是,该CreateThread函数不会为C运行时库正确设置堆栈.您应该使用_beginthreadex,它(几乎)完全兼容CreateThread.

  • 这个答案是对的.GCC运行时完全没有对Win32 API的影响. (10认同)
  • 在这种情况下,第三方线程库如boost或Qt怎么样?你有没有办法在mingw64中使用这些库而不必为这些库找出底层的线程库?如果我随意决定使用带有mingw的posix变体的boost :: threads,会发生什么? (7认同)

小智 11

请注意,现在可以在win32线程模式下使用一些C++ 11 std :: thread.这些仅限标头的适配器为我开箱即用:https: //github.com/meganz/mingw-std-threads

从修订历史记录看,最近有一些尝试将其作为mingw64运行时的一部分.