C++ 如何启用实验C++;MinGW中的11个并发特性?
当试图编译以下代码时C++ 如何启用实验C++;MinGW中的11个并发特性?,c++,gcc,concurrency,c++11,mingw,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++11实验并发特性?我有MinGW GCC 4.5.1(TDM) 编辑:顺便说一句,Visual Studio 2012在这个代码示例中表现良好。说它已经实现,但您可能需要一个
#include <thread>
#include <iostream>
void foo() { std::cout << "foo\n"; }
int main()
{
std::thread t(foo);
t.join();
}
如何使用C++11实验并发特性?我有MinGW GCC 4.5.1(TDM)
编辑:顺便说一句,Visual Studio 2012在这个代码示例中表现良好。说它已经实现,但您可能需要一个SVN版本来获得该页面上列出的所有内容。看起来它将帮助您获得最先进的构建。据我所知,MinGW还不支持新的c++0x并发特性(从GCC 4.5开始)。我记得读过一次邮件列表交换,其中指出在MinGW中,线程头中的以下ifdef不满足:
#if defined(_GLIBCXX_HAS_GTHREADS)
我想这与在Windows下构建MinGW的方式有关,无论它使用本机线程还是pthread,等等。在我的代码中,我编写了一些在Windows中使用Boost.thread而不是本机c++0x线程的最小包装。这两个接口非常相似,对于许多用途,它们可以毫无问题地交换
编辑:感谢Luc Danton挖掘出上述邮件列表线程:
当您得到一个支持
std::thread
的编译器时,下面是您的更正示例(两个较小的o型):
#包括
#包括
void foo(){std::cout正如其他人所提到的,gcc的mingw端口不提供现成的C++0x并发支持。但是,商业版提供了这些功能,因此您可以使用std::thread
免责声明:我是just::thread库的主要开发人员。我目前正在开发一个使用新的mingw-w64 winpthreads库的GCC。这将在GCC中启用posix线程模型,并正在努力使其正常工作。另一个mingw-w64用户已经通过黑客攻击实现了这一功能大约(合理地),但我试图在主线GCC中完成它,在工具链安装后不需要手动干预
现在的讨论可以继续下去。一旦所有粗糙的边缘都被磨平了,我会更新这个答案
编辑:由于一次升级投票,我注意到了这个答案。我已经构建了一个实验性的GCC 4.7,它应该与std::thread
一起工作,但只有在静态链接时(将-static
添加到link命令中)。公告如下。尝试MinGw构建:
此安装程序将允许您选择所需的任何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;
}
std::threads和sync原语已经有了轻量级的本机实现:
这是一个只包含头的库,它应该可以与任何C++11版本的MinGW一起使用。所讨论的交换:@Luc:感谢交换,它们在这里可能存在可移植性问题。仅供参考:std::thread和boost::thread的DTOR对于仍然可连接的线程具有完全不同的语义链接已失效且不可用的(下图)指向一个非常轻的包装头谢谢。我修正了问题中的拼写错误。很遗憾,这不是一个真正的答案。请看这个。
#include <thread>
#include <iostream>
void foo() { std::cout << "foo\n"; }
int main()
{
std::thread t(foo);
t.join();
}
//Threading01.cpp
#include <thread>
#include <iostream>
void hello()
{
std::cout<< "Hello Threading ..." << std::endl;
}
int main()
{
std::thread t1(hello);
t1.join();
return 0;
}
C:\CPP>g++ std=c++11 -g -Wall -lpthread -o Threading01 Threading01.cpp