gpt4 book ai didi

c++ - 如何启动一个运行成员函数的 boost::thread?

转载 作者:行者123 更新时间:2023-11-30 02:52:12 25 4
gpt4 key购买 nike

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

所有设备共享大量代码,但每个设备也有一些特定于设备类型的内容。我正在尝试编写此代码以便于使用新型硬件进行扩展。

每个连接的设备都应该有一个在单独线程中运行的事件管理器函数。我想将通用的东西保留在基类中,我们称它为“设备”,并将特定于硬件的代码放在派生类中。

所以我创建了一个包含通用内容的 Device 基类,并使事件管理器成为纯虚拟的,然后每个派生类都实现了它。

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

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

所以我尝试这样的事情:

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 );
};

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

结束

错误:没有匹配函数来调用 'boost::thread::thread()'

...即使我将设备动态转换为指向适当的 SpecificDeviceX 类的指针,我仍然会遇到相同的错误。

最佳答案

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如果可能的话。

关于c++ - 如何启动一个运行成员函数的 boost::thread?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19181541/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com