当使用Win32线程模型时,MinGW-w64是否直接支持std :: thread?

30

在安装MinGW-w64工具链时,我选择了Win32线程模型,因为我读到它比POSIX模型提供更好的性能。我没有资格自己对这个说法进行基准测试,但这里有一个来源

起初,我认为这个选项只会影响GCC运行时的内部工作,而不会阻止我在我的代码中使用C++11线程,基于这个答案这个评论,由fellow user rubenvb提供。

然而,事实并非如此。在这个MinGW-w64安装中,std::thread支持似乎不存在。

我从命令行调用g++,除了-std=c++11之外没有其他选项。

目前我不确定:

  • rubenvb 是否错了,是否需要在 POSIX 线程模型下安装 MinGW-w64 才能编译依赖于 C++11 thread 库的代码,或者;
  • 我完全误解了一切,或者;
  • std::thread 实际上在我的情况下是被支持的,只是不直观。

我强调标题中的“开箱即用”部分。有一个名为 mingw-std-threads 的库,如 this answer 所示。然而,作为第三方选项,它与本问题无关。

所以,截至今天(2016 年 5 月),当使用 Win32 内部线程模型安装 MinGW-w64 时,是否原生支持 std::thread 依赖代码?


安装mingw-std-threads,就像你链接的那样,可以正常工作,大约需要30秒钟。 - M.M
1
@M.M...谢谢您的建议,我已经这样做了。然而,这个问题主要是出于好奇心/规范性考虑。不同来源之间的信息似乎存在分歧。 - Marc.2377
我的回答和评论都没有错。它们是在 mingw-std-threads 库不可用的时候编写的(或者至少我不知道它的存在)。GCC 使用其内部线程模型设置为 win32 不支持 C++11 线程功能,这是事实。你链接的我的回答就是说了这一点。另一方面,我的评论并没有谈论 C++11 线程支持。相反,它处理的是使用 GCC 构建的 win32/posix 作为其内部线程模型来调用 pthreads 或 win32 线程相关函数,所有这些都按照人们的期望工作。这些是两个非常不同的主题。 - rubenvb
嗨@rubenvb,谢谢你的建议。看起来第二点 - “我完全误解了一切” - 是正确的情况。我没有正确注意到你提到的“API”这个术语。 - Marc.2377
1个回答

30

如果要在Win32本地线程中使用MinGW-w64,您可以安装mingw-std-threads头文件。

正如该页面中所述,这是因为MinGW-w64是GCC的一个移植版本,但是GCC不包括任何本地线程支持。相反,GCC安装通常通过glibc的gthreads或pthread来实现线程。 MinGW-w64不包括glibc的移植版。(相反,它使用MSVC运行时加上自己的代码来填补空白部分)。

还如该页面所述,最近的MinGW-w64版本包括对pthread的Win32端口(“winpthreads”),这解释了为什么您可以通过选择MinGW-w64安装程序中的“pthread”模型来开箱即用地使用线程。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接