我正在尝试在我的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进行编译.