编译C++线程

dv_*_*dv_ 7 c++ linux multithreading c++11

我正在尝试在我的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();
}
Run Code Online (Sandbox Code Playgroud)

编译时,我得到了这些错误:

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*)>'
Run Code Online (Sandbox Code Playgroud)

还有更多......

我正在编译:

g++ -std=c++0x  C.cpp
Run Code Online (Sandbox Code Playgroud)

编译器版本:

$g++ --version
g++ (GCC) 4.7.0 20120507 (Red Hat 4.7.0-5)
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

Bar*_*rry 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;
}
Run Code Online (Sandbox Code Playgroud)

或者,您可以将void*arg 提供给thread构造函数:

std::thread t ( &C::code, &c, nullptr );
                              ^^^^^^^
Run Code Online (Sandbox Code Playgroud)

无论哪种方式,请确保您编译-pthread.