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 &lt;&lt;... 编译得很好..

谁能帮帮我?

【问题讨论】:

如果您查看线程标题,似乎该类仅存在#if defined(_GLIBCXX_HAS_GTHREADS) &amp;&amp; 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.cpp

a.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?

在运行之前获取 std::thread 的 thread:id?

带有 winsock 和 std::thread 的 C++ 多线程服务器

分离的 std::thread 终止后是不是需要删除?