繁体   English   中英

C++ pthread 将对象移交给线程

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM