我正在尝试在我的C应用程序上使用线程.
我的代码是:
#include <iostream> #include <thread> class C { public: void * code( void * param ) { std::cout << "Code thread executing " << std::endl; return NULL; } }; int main() { C c; std::thread t ( &C::code,&c ); t.join(); }
编译时,我得到了这些错误:
In file included from /opt/centos/devtoolset-1.0/root/usr/lib/gcc/x86_64-redhat-linux/4.7.0/../../../../include/c++/4.7.0/bits/move.h:57:0,from /opt/centos/devtoolset-1.0/root/usr/lib/gcc/x86_64-redhat-linux/4.7.0/../../../../include/c++/4.7.0/bits/stl_pair.h:61,from /opt/centos/devtoolset-1.0/root/usr/lib/gcc/x86_64-redhat-linux/4.7.0/../../../../include/c++/4.7.0/bits/stl_algobase.h:65,from /opt/centos/devtoolset-1.0/root/usr/lib/gcc/x86_64-redhat-linux/4.7.0/../../../../include/c++/4.7.0/bits/char_traits.h:41,from /opt/centos/devtoolset-1.0/root/usr/lib/gcc/x86_64-redhat-linux/4.7.0/../../../../include/c++/4.7.0/ios:41,from /opt/centos/devtoolset-1.0/root/usr/lib/gcc/x86_64-redhat-linux/4.7.0/../../../../include/c++/4.7.0/ostream:40,from /opt/centos/devtoolset-1.0/root/usr/lib/gcc/x86_64-redhat-linux/4.7.0/../../../../include/c++/4.7.0/iostream:40,from C.cpp:1: /opt/centos/devtoolset-1.0/root/usr/lib/gcc/x86_64-redhat-linux/4.7.0/../../../../include/c++/4.7.0/type_traits: In instantiation of 'struct std::_Result_of_impl<false,false,std::_Mem_fn<void* (C::*)(void*)const>,C*>': /opt/centos/devtoolset-1.0/root/usr/lib/gcc/x86_64-redhat-linux/4.7.0/../../../../include/c++/4.7.0/type_traits:1857:12: required from 'class std::result_of<std::_Mem_fn<void* (C::*)(void*)const>(C*)>'
还有更多……
我正在编译:
g++ -std=c++0x C.cpp
编译器版本:
$g++ --version g++ (GCC) 4.7.0 20120507 (Red Hat 4.7.0-5)
我究竟做错了什么?
解决方法
std :: thread与POSIX线程不同,它不必采用void *参数并返回void *.只要指定了正确的参数,线程构造函数就可以使用任何可调用的.
这种情况下的具体错误是你试图启动一个有效调用c.code()的线程(技术上是INVOKE(& C :: code,& c)),但这是一个无效的调用,因为C ::代码接受一个参数,你试图用零调用它.只需在代码()上修复签名即可与您调用的内容相匹配:
void code() { std::cout << "Code thread executing " << std::endl; }
或者,您可以向线程构造函数提供void * arg:
std::thread t ( &C::code,&c,nullptr ); ^^^^^^^
无论哪种方式,请确保使用-pthread进行编译.
原文地址:https://www.jb51.cc/c/119244.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。