1

使用 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将调用该类型的构造函数。

根据Boost 1.43 线程规范

通过传递可调用类型的对象来启动新线程

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

进一步阅读如何使用函数来实现这一点

4

3 回答 3

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));
于 2012-09-13T01:14:48.253 回答
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;
}
于 2012-09-13T02:16:16.840 回答
0

代替:

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

调用一个实例:

boost::thread(MyStruct(), ...);
于 2012-09-13T01:12:10.660 回答