mingw-w64线程:posix vs win32


127

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

看来,此选项指定某个程序或库将使用哪个线程API,但又由什么使用?是通过GCC,libstdc ++还是其他?

我发现了这一点: Windows的gcc端口中的thread_posixs和thread_win32有什么区别?

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

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


由使用 gcc 创建的应用程序使用。
devnull

@devnull,这不是由我要使用的API决定的吗?如果我选择MinGW的pthreads版本,那么什么会阻止我将WinAPI用于线程?
西蒙(Simon)

gcc会阻止您,或者更确切地说:会变得不稳定
jiggunjer 2015年

Answers:


122

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

我必须强调,此选项不会禁止您编写任何代码(它对您可以在代码中调用的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的用户代码。您可以同时使用两者。


7
您始终可以静态链接gcc运行时和winpthreads,从而消除了包含DLL的必要性。
亚历山大·希申科

3
我花了一段时间来寻找在Linux上相应的选项,所以在情况下,它可以帮助其他人:包g++-mingw-w64-x86-64提供了两个文件x86_64-w64-mingw32-g++-win32x86_64-w64-mingw32-g++-posix,并x86_64-w64-mingw32-g++化名为其中之一; 见update-alternatives --display x86_64-w64-mingw32-g++
stewbasic

嗯,您说“ ...当使用内部Win32线程模型构建GCC时,它没有完整的实现...。MinGW-w64提供了Winpthreads(在Win32多线程API之上的pthreads实现),GCC可以然后链接以启用所有精美功能。” 因此,如果我选择win32模型,GCC仍可以启用所有功能,因为它利用了winpthreads吗?但是在下面的项目符号中,您编写了“ win32:没有C ++ 11多线程功能”。我不明白 “然后可以将GCC链接到...”是否意味着如果我选择win32,则可以选择...?
Johannes Schaub-litb

@ JohannesSchaub-litb好吧,不。GCC的配置魔术将内部线程模型选择与libstdc ++的启用功能结合在一起,因为后者是在GCC的内部“ gthread”包装器(这只是一个类似于posix的线程抽象)之上构建的。缺少C ++ 11功能的基本知识在当您使用的层--threads=win32。因此,只要失位没有在GCC中实现,您必须配置GCC --threads=win32
rubenvb

我可以将qt的mingw预编译库(使用-win32)与其他使用-posix的库一起使用,并在同一程序中同时使用这两个库吗?
Johannes Schaub-litb

16

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

即使您使用运行时的Win32线程版本,您也可能不应该直接调用Win32 API。引用MinGW常见问题解答

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


7
在这种情况下,boost或Qt等第三方线程库又如何呢?您有什么方法可以将这些库与mingw64一起使用,而不必弄清楚这些的基础线程库?如果我任意决定使用带有mingw的posix变体的boost :: threads会发生什么?
tantuni 2014年

1
@ user460153一些信息qt-project.org/wiki/...
亚历五,

10
这个答案是错误的。GCC运行时对Win32 API完全没有影响。
rubenvb

阅读链接的常见问题解答条目。这个答案是正确的。
Daira Hopwood

13

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

从修订历史记录看来,最近有一些尝试使它成为mingw64运行时的一部分。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.