mingw-w64主题:posix vs win32

时间:2013-06-21 19:01:17

标签: windows gcc pthreads mingw

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

似乎此选项指定某些程序或库将使用哪个线程API,但是通过什么?通过GCC,libstdc ++还是别的什么?

我发现了这个: Whats the difference between thread_posixs and thread_win32 in gcc port of windows?

  

简而言之,对于这个版本的mingw,threads-posix版本将使用posix API并允许使用std :: thread,而threads-win32将使用win32 API,并禁用std :: thread标准的一部分。

好的,如果我选择win32线程,那么std :: thread将不可用,但仍会使用win32线程。但用什么?

3 个答案:

答案 0 :(得分:87)

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

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

总结:

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

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

答案 1 :(得分:15)

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

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

  

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

答案 2 :(得分:10)

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

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