如何启动boost :: thread运行成员函数?

时间:2013-10-04 12:45:52

标签: c++ multithreading boost

我有一个实时控制器应用程序,其中连接了许多不同类型的硬件设备。

所有设备共享大量代码,但每个设备都有一些特定于设备类型的内容。我试图编写这个代码,以便用新类型的hw轻松扩展。

每个连接的设备都应该有一个在单独的线程中运行的事件管理器功能。 我想把常见的东西保存在基类中,让我们把它称为" Device"并将硬件特定代码放在派生类中。

因此,我使用常见的东西创建一个Device基类,并使事件管理器成为纯虚拟的,然后每个派生类实现它。

然后在系统启动时,我创建了一个所有连接硬件设备的向量,并将指向适当派生类的实例的指针推入其中。

现在我想为向量中的每个实例启动一个boost :: thread,每个线程都应该从向量中的该实例执行事件管理器函数。

所以我尝试了类似的东西:

Class Device {
...
    boost::thread thread;
    void manager() = 0;
...
}

Class SpecificDevice1 : public Device {
...
    void manager();
}

SpecificDevice1::manager() {
...do stuff here...
}

Class SpecificDevice2 : public Device {
...
    void manager();
}

SpecificDevice2::manager() {
...do stuff here...
}

Class Config {
...
    std::vector<Device*> devices;
...
}

Config config;
...config.devices get populated with pointers to instances of SpecificDevice1 and SpecificDevice2...

for( auto &device : config.devices ) {
    device->thread = boost::thread( device->manager );
};

我尝试了很多不同的排列,但我总是以

结束

错误:没有匹配函数来调用&#39; boost :: thread :: thread()&#39;

...即使我将dynamic_cast设备指向一个指向相应的SpecificDeviceX类的指针,我仍然会得到同样的错误。

1 个答案:

答案 0 :(得分:3)

boost::thread构造函数需要一个函数指针,一个实际对象的实例(对于成员函数中的this指针)。

对于此用途,可以使用Thread Constructor with arguments

device->thread = boost::thread(&Device::manager, device);

第一个参数是指向成员函数的指针,第二个参数是指向Device实例的指针。

要做到这一点,你必须做的另一个改变,就是让manager函数virtual,为正确的函数调用:

Class Device {
    ...
    boost::thread thread;
    virtual void manager() = 0;
    ...
}

顺便说一下,由于您使用的是支持C ++ 11的编译器,我建议您尽可能更改为std::thread