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