std::thread 错误(线程不是 std 的成员)
Posted
技术标签:
【中文标题】std::thread 错误(线程不是 std 的成员)【英文标题】:std::thread error (thread not member of std) 【发布时间】:2010-03-25 21:39:19 【问题描述】:我使用 macports 编译并安装了 gcc4.4。
当我尝试使用 -> g++ -g -Wall -ansi -pthread -std=c++0x main.cpp...进行编译时...:
#include <thread>
...
std::thread t(handle);
t.join();
....
编译器返回:
cserver.cpp: In member function 'int CServer::run()':
cserver.cpp:48: error: 'thread' is not a member of 'std'
cserver.cpp:48: error: expected ';' before 't'
cserver.cpp:49: error: 't' was not declared in this scope
但是std::cout <<...
编译得很好..
谁能帮帮我?
【问题讨论】:
如果您查看线程标题,似乎该类仅存在#if defined(_GLIBCXX_HAS_GTHREADS) && defined(_GLIBCXX_USE_C99_STDINT_TR1)
。不过我不确定,你必须做什么才能定义这些。
@UncleBens:我相信这些是由-pthread 和-std=c++0x 直接定义的。省略 -pthread 会导致段错误:gcc.gnu.org/ml/gcc-help/2009-04/msg00208.html
最新更新:MacPorts gcc 4.7.0 支持/编译 std::thread,而 4.6.3 不支持。
【参考方案1】:
gcc 还不完全支持 std::thread:
http://gcc.gnu.org/projects/cxx0x.html
http://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html
同时使用boost::thread。
编辑
尽管使用 gcc 4.4.3 对我来说以下编译并运行良好:
#include <thread>
#include <iostream>
struct F
void operator() () const
std::cout<<"Printing from another thread"<<std::endl;
;
int main()
F f;
std::thread t(f);
t.join();
return 0;
编译
g++ -Wall -g -std=c++0x -pthread main.cppa.out
的输出:
你能提供完整的代码吗?也许那些...
s 中潜伏着一些不为人知的问题?
【讨论】:
我试过你的代码,我得到了同样的错误......这可能与 OSX 相关吗?或者 MacPorts 安装的 GCC 可能有什么问题? 可能是 MacPorts 不完全支持 c++0x 功能?你有你的 gcc 配置脚本的输出吗?这是一位 Mac 用户,其 configure 指定不支持 std::thread:(mail-archive.com/dealii@dealii.org/msg00973.html)【参考方案2】:去掉-ansi,意思是-std=c++98,你显然不想要。它还会导致宏 __STRICT_ANSI__
被定义,这可能会改变标头的行为,例如通过禁用 C++0x 支持。
【讨论】:
宏名其实后面有两个下划线,但是如果我写对了,就会误解为格式。 很好指出,我删除了它,但它仍然给我同样的错误。我尝试使用 gcc4.4 和 gcc4.5 beta ......这令人沮丧。 修复了缺少下划线的问题。【参考方案3】:我在使用 MinGW 的 Windows 上遇到了同样的问题。我在 github mingw-std-threads 上找到了 in 的包装类,包括 mingw.mutex.h、mingw.thread.h 文件到全局 MinGW 目录修复了这个问题。我所要做的就是包含头文件并且我的代码保持不变
#include "mingw.thread.h"
...
std::thread t(handle);
...
【讨论】:
为此干杯。快把我逼疯了。在您提到全局 MinGW 目录的地方,您的回答有点令人困惑。我不得不将文件放到项目文件夹中,所有其他 .h 文件都将在该文件夹中正常工作......但它工作了。 好吧,全局目录是什么意思,我试图找到在哪里插入它尝试与 /bin /include 的全局相同级别不起作用。提前谢谢你以上是关于std::thread 错误(线程不是 std 的成员)的主要内容,如果未能解决你的问题,请参考以下文章
在类构造函数线程中启动 std::thread 是不是安全?
std::thread,在线程中抛出异常会导致 Visual C++ 中的中止错误
在运行之前获取 std::thread 的 thread:id?