将struct类型的地址传递给boost :: thread?

时间:2012-09-13 00:03:23

标签: c++ pointers struct boost-thread

使用Boost 1.43线程,以下内容是可编译的:

void MyClass::threadFn(...) { ... }
void MyClass::doFn(...) {
    ...
    boost::thread(&MyClass::threadFn, this, ...);
}

但以下是可编译:

void MyClass:doFn(...) {
    ...
    struct MyStruct {
        MyStruct(...) { ... };
    }

    boost::thread(&MyStruct, ...);
}

这会产生'MyClass::doFn::MyStruct': illegal use of this type as an expression。请注意,我没有尝试将指针传递给MyStruct的实例;我试图传递类型本身,因为我会使用函数指针,以便boost::thread将调用该类型的构造函数。

根据The Boost 1.43 Threads Spec

  

通过传递可调用类型的对象

来启动新线程

那么如何将struct类型的地址传递给boost::thread函数(AFAIK这也适用于boost::bind)?

Further reading on how to accomplish this with functions

3 个答案:

答案 0 :(得分:1)

我不确定目的是什么,但以下内容会调用MyStruct()

boost::thread(boost::bind(boost::value_factory<MyStruct>()));

您也可以传递参数,例如使用MyStruct(int i, int j)

boost::thread(boost::bind(boost::value_factory<MyStruct>(), 1, 2));

答案 1 :(得分:1)

MyStruct不是可调用类型。您需要定义一个在MyStruct上运行的函数,然后使用该函数来实例化该线程。

线程是一个执行上下文,要实例化一个线程,你需要一组指令来执行它。

在Java中,我们以Runnable的形式看到它,它用于实例化一个Thread,然后可以start()编辑。

在带有Boost的C / C ++中,必须使用函数指针。

术语“可调用类型”大致转换为“可与函数指针交换的类型”。

如果你想对任意结构进行操作,就像在你的例子MyStruct中那样,你首先必须定义一组对该类型进行操作的指令(一个函数)。

一旦知道了指令集,就可以传递一个指向该函数的指针来实例化一个线程,然后用任意MyStruct实例运行该线程。

代码如下:

struct MyStruct {
        MyStruct(...) { ... }
    };

int frobnicateMyStruct( const MyStruct& msr ) {

    /* some operations on msr */

    return 0;
}    

void foo() {

    MyStruct myStructInstance;
    boost::thread(&frobnicateMyStruct, myStructInstance);

    /* ... */

    return;
}

答案 2 :(得分:0)

而不是:

boost::thread(&MyStruct, ...);

调用实例:

boost::thread(MyStruct(), ...);