[英]C++ pthread hand over object to thread
我想通过我的代码,我将对象的地址交给线程。 但是我无法直接访问该对象(args.getTerminationStatus)。
不幸的是,我只复制了传递的对象,因此属性的更改无效(while 循环永远运行,甚至认为 getTerminationStatus() 背后的属性已在外部更改)。 如果你有一些想法就好了。 提前致谢。
int main(){
Sensors barometer(1, "Barometer", 0); //ID, Description, Value
pthread_t t1;
int ret1;
ret1 = pthread_create(&t1, NULL, &barometerThread, &barometer); //Hand over object to thread
if(ret1 != 0){
cout << "Error: Thread 1 (Luftdruckmesser) konnte nicht erstellt werden." << endl;
return 1;
}
sleep(10);
barometer.finish(); // Sets TerminationStatus to true
void *barometerThread(void *args){
Sensors dev = *(Sensors *) (args); // I think this is just a copy of that passed object
cout << "Luftdruck-Thread gestartet. Device-ID: " << dev.getID() << " Descr.: " << dev.getDescription() << " Value: " << dev.getValue() << endl;
while (!dev.getTerminationStatus()){
cout << "Still in loop: " << dev.getTerminationStatus() << endl;
sleep(1);
}
pthread_exit(0);
}
您不需要制作副本。 由于您绝对确定传递给函数的void*
指向Sensor
您可以转换指针:
void *barometerThread(void *args){
Sensor* dev_ptr = (Sensor*)args;
// ....
通常应该首选适当的 C++ 转换( static_cast
/ dynamic_cast
),尽管我们正在处理void*
并且无论如何这完全取决于您以确保转换正确,c 样式转换是“可以的”。
请注意,您缺少函数中的return
,但它必须返回一个void*
。 如果不是,则调用未定义的行为。 还有std::thread
可以让您远离这种void*
时代错误。
您可以通过将转换行更改为:
Sensors& dev = *(Sensors *) (args);
所以现在它将是对Sensors
对象的引用,而不是副本。
假设getID()
是Sensors
类方法,您可以执行以下操作:
cout << dev.getID();
在你转换它之后。
如果您还没有考虑过,使用std::thread
会让这里的生活更轻松一些(因为它接受std::function
,您可以将任意类型的数据绑定到它)。 要记住的另一件事是Sensors
类实例将从两个线程访问,因此请确保barometer.finish()
和dev.getTerminationStatus()
都是线程安全的!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.