编译C线程

前端之家收集整理的这篇文章主要介绍了编译C线程前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试在我的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进行编译.

猜你在找的C&C++相关文章