如何在 MinGW 中启用实验性 C++11 并发功能

How to enable experimental C++11 concurrency features in MinGW?

本文关键字:实验性 C++11 并发 功能 启用 MinGW      更新时间:2023-10-16

尝试编译以下代码时

#include <thread>
#include <iostream>
void foo() { std::cout << "foon"; }
int main()
{
  std::thread t(foo);
  t.join();
}

我收到一个错误:

C:Test>g++ -g -Wall -lpthread -std=c++0x
main.cpp
main.cpp: In function 'int main()':
main.cpp:12:2: error: 'thread' is not a member of 'std'
main.cpp:12:14: error: expected ';' before 't'
main.cpp:13:2: error: 't' has not been declared

如何使用 C++11 实验性并发功能?我有 MinGW GCC 4.5.1 (TDM)

编辑:顺便说一句,Visual Studio 2012 在此代码示例中表现良好。

据我所知,MinGW还不支持新的c ++ 0x并发功能(从GCC 4.5开始)。我记得读过一个邮件列表交换,其中指出在 MinGW 中,线程标头中的以下 ifdef 不满足:

#if defined(_GLIBCXX_HAS_GTHREADS)

我想这与 MinGW 在 Windows 下的构建方式有关,无论它使用本机线程还是 pthread 等。在我的代码中,我编写了一些最小的包装,在Windows中使用Boost.thread而不是本机c ++ 0x线程。这两个接口非常相似,对于许多用途,它们可以毫无问题地交换。

编辑:感谢Luc Danton挖掘出上面提到的邮件列表线程:

http://comments.gmane.org/gmane.comp.gnu.mingw.user/33065

我目前正在研究使用新的 mingw-w64 winpthreads 库来制作一个 GCC。这将在 GCC 中启用 posix 线程模型,并且正在努力使其正常工作。另一个 mingw-w64 用户已经通过黑客攻击(明智地)获得了此功能,但我正在尝试在主线 GCC 中完成它,而无需在工具链安装后进行手动干预。

可以在这里进行本讨论。一旦所有粗糙的边缘都被抚平,我将更新这个答案。

编辑:由于投票赞成,这个答案引起了我的注意。我已经构建了一个实验性的GCC 4.7,它应该与std::thread一起使用,但仅在静态链接时(将-static添加到link命令中)。公告在这里。

C++0x 库状态页面显示它已实现,但您可能需要 SVN 版本才能获取该页面上列出的所有内容。 此页面看起来可以帮助您获得最前沿的构建。

正如其他人所提到的,gcc 的 mingw 端口不提供开箱即用的 C++0x 并发支持。但是,商业的 just::thread 库提供了这些功能,因此您可以将std::thread与 gcc 4.5.2 的 TDM/mingw 端口一起使用。

免责声明:我是just::thread库的主要开发人员。

已经有一个轻量级的 std::threads 和同步原语的原生实现:https://github.com/meganz/mingw-std-threads

它是一个仅标头库,它应该适用于任何 C++11 版本的 MinGW。

当你得到一个支持std::thread的编译器时,下面是你更正的示例(两个次要的 o型):

#include <thread>
#include <iostream>
void foo() { std::cout << "foon"; }
int main()
{
  std::thread t(foo);
  t.join();
}

尝试 MinGw 构建:

http://sourceforge.net/projects/mingwbuilds/

此安装程序将允许您选择所需的任何 MinGW,并且还包括 c++11 线程功能。

还有另一种选择。

//Threading01.cpp
#include <thread>
#include <iostream>
void hello()
{
    std::cout<< "Hello Threading ..." << std::endl;
}
int main()
{
    std::thread t1(hello);
    t1.join();
    return 0;
}
下载 mingw-w64

(sourceforge.net 上的 mingw-w64 项目正在迁移到 mingw-w64.org)并执行他们提供的.bat文件(mingw-w64.bat)。在提供的命令行中,您可以像这样执行线程代码

C:CPP>g++ std=c++11 -g -Wall -lpthread -o Threading01 Threading01.cpp