编译C ++线程

时间:2015-06-23 19:45:13

标签: 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();
}

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

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)

我做错了什么?

2 个答案:

答案 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