簡體   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