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

时间:2011-05-08 22:31:16

标签: c++ gcc concurrency c++11 mingw

尝试编译以下代码时

#include <thread>
#include <iostream>

void foo() { std::cout << "foo\n"; }

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)

编辑: BTW,Visual Studio 2012表现良好。

8 个答案:

答案 0 :(得分:14)

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

#if defined(_GLIBCXX_HAS_GTHREADS)

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

编辑 :感谢Luc Danton挖掘出上述邮件列表主题:

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

答案 1 :(得分:5)

我目前正在努力获得一个使用新的mingw-w64 winpthreads库的GCC。这将在GCC中启用posix线程模型,并且正在开展工作以使其按预期工作。另一个mingw-w64用户已经通过黑客攻击(明智地)实现了这一功能,但是我试图在主线GCC中完成它,而不需要在工具链安装后进行人工干预。

目前的讨论可以遵循here。一旦所有粗糙边缘被平滑,我将更新此答案。

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

答案 2 :(得分:4)

C++0x library status page表示已经实施,但您可能需要SVN版本才能获得该页面上列出的所有内容。 This page看起来会帮助你获得前沿的建设。

答案 3 :(得分:4)

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

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

答案 4 :(得分:3)

已经有std :: threads和sync基元的轻量级本机实现: https://github.com/meganz/mingw-std-threads

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

答案 5 :(得分:2)

当你得到一个支持std::thread的编译器时,这是你更正的例子(两个小型o):

#include <thread>
#include <iostream>

void foo() { std::cout << "foo\n"; }

int main()
{
  std::thread t(foo);
  t.join();
}

答案 6 :(得分:1)

尝试MinGw版本:

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

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

答案 7 :(得分:0)

还有另一种选择。

//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