使用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
)?
答案 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(), ...);