如何在 MinGW 中启用实验性 C++11 并发功能
How to enable experimental C++11 concurrency features in MinGW?
尝试编译以下代码时
#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
- MSVC是否支持C++11样式的属性而不是__declspec
- 创建LinkedList退出,返回代码为-11(SIGSEGV)
- 我可以将一个用clang c++11编译的对象与另一个用c++17编译的对象链接起来吗
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 如何将模板转换为C++11之前的模板
- c++11评估顺序(未定义的行为)
- C++中的VLA,扩展名为std=C++11
- 代码在我的计算机上运行良好,但是在将其提交给coursera时遇到未知的信号11问题
- "类模板示例<int>;"语句对 C++11 是什么意思?
- this_thread::sleep_for和计时时钟之间的关系是否由C++11标准指定
- 如何使用lock_guard在c++11中实现scoped_lock功能
- C++11 中不同类型的对象的 std::array 的替代方案
- 为什么 -mmacosx-version-min=10.10 不阻止使用标记为从 10.11 开始的函数?
- 为什么我的C++代码中出现'Segmentation Fault: 11'行?
- 强枚举类型定义:Clang Bug 还是 C++11 标准不确定性?
- 别名模板的专业化 C++11 中没有开销的最佳替代方案
- STLPort using C++11
- Qt 5.11.2 (Clang 8.0 (Apple), 64 位), 找不到 QJSEngine 文件
- 在 C++11 中,如何查找并返回以给定字符串开头的字符串向量中的所有项?
- 如何在 MinGW 中启用实验性 C++11 并发功能