繁体   English   中英

编译C ++线程

[英]Compiling C++ threads

我正在尝试在我的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* 只要指定了正确的参数, thread构造函数就可以使用任何可调用的。

这种情况下的具体错误是你试图启动一个有效调用c.code()的线程(技术上是INVOKE(&C::code, &c) ),但这是一个无效的调用,因为C::code接受一个参数而你试图用零来调用它。 只需在code()上修复签名即可与您调用的内容相匹配:

void code()
{
    std::cout << "Code thread executing " << std::endl;
}

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

std::thread t ( &C::code, &c, nullptr );
                              ^^^^^^^

无论哪种方式,请确保使用-pthread进行编译。

使用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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM