2013-06-21 68 views
68

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

看起来这个选项指定哪个线程API将被某些程序或库使用,但是由什么指定?通过GCC,libstdC++或其他东西?

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

总之,对于这个版本的MinGW的,线程,POSIX版本将使用POSIX API,并允许使用的std ::线程,和线程的Win32将使用win32 API,并禁用标准的std :: thread部分。

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

+0

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

+0

@devnull,这是不是由我决定用API?如果我将选择MinGW的pthreads版本,那么会阻止我使用WinAPI进行线程的操作? – Simon

+0

gcc会阻止你,或者说:变得不稳定 – jiggunjer

回答

58

GCC带有一个编译器运行时库(libgcc),它用于(除其他外)提供一个底层操作系统抽象,用于支持多语言相关功能。最相关的例子是libstdC++的C++ 11 <thread>,<mutex><future>,当使用其内部Win32线程模型构建GCC时,它没有完整的实现。 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的用户代码都没有影响。你可以一直使用两者。

+5

您可以始终静态链接gcc运行时和winpthreads,消除DLL包含的必要性。 –

+4

**非常**相关:http://stackoverflow.com/questions/37358856 –

+0

我花了一段时间在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 ++'。 – stewbasic

15

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

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

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

+7

在这种情况下,第三方线程库如boost或Qt怎么样?有什么办法可以将这些库与mingw64一起使用,而无需为这些库找出底层线程库吗?如果我擅自决定使用带有mingw的posix变体的boost :: threads,会发生什么? – tantuni

+1

@ user460153 some info http://qt-project.org/wiki/MinGW-64-bit#03a4097f5708a02b5f19f72476b49adc –

+9

这个答案是错误的。 GCC运行时完全不影响Win32 API。 – rubenvb

9

请注意,现在可以在win32线程模式下使用一些C++ 11 std :: thread。这些只有标题的适配器工作开箱对我来说: https://github.com/meganz/mingw-std-threads

从修订历史记录,它看起来像有一些最近试图使这个mingw64运行时的一部分。