尝试编译以下代码时
#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表现良好。
答案 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挖掘出上述邮件列表主题:
答案 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::thread
与TDM/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)
答案 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