我试图在我的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)
我做错了什么?
答案 0 :(得分:8)
std::thread
与POSIX线程不同,它不必采用void*
参数并返回void*
。只要指定了正确的参数,thread
构造函数就可以获取任何可调用的值。
在这种情况下的具体错误是您尝试启动一个有效调用c.code()
(技术上为INVOKE(&C::code, &c)
)的线程,但这是一个无效调用,因为C::code
接受一个参数而你试图用零来调用它。只需在code()
上修复签名即可与您调用的签名相匹配:
void code()
{
std::cout << "Code thread executing " << std::endl;
}
或者,您可以向void*
构造函数提供thread
arg:
std::thread t ( &C::code, &c, nullptr );
^^^^^^^
无论哪种方式,请确保使用-pthread
进行编译。
答案 1 :(得分:3)
使用operator()
使C类成为可调用对象#include <iostream>
#include <thread>
class C
{
public:
void operator()( void )
{
std::cout << "Code thread executing " << std::endl;
return NULL;
}
};
int main()
{
C c;
std::thread t (c );
t.join();
}
或将您的类转变为可调用对象
#include <iostream>
#include <thread>
#include <functional>
class C
{
public:
void * code( void)
{
std::cout << "Code thread executing " << std::endl;
return NULL;
}
};
int main()
{
C c;
std::thread t (std::bind( &C::code, &c ));
t.join();
}
并切换到--std = c ++ 11