0

我需要幫助,我的C++程序。 我開始主函數旁主題:從線程訪問一個對象的變量

thread Thread1(&Foo::Loop1, info,std::ref(info)); 
thread Thread2(&Foo::Loop2, info,std::ref(info)); 

info是從含有bool active

Foo一個對象後,我改變Loop1Loop2activetrue但該值不變化。他們每次都是一樣的。

我的函數原型是這樣的:

void Loop1(Foo info); 
void Loop2(Foo info); 

調用的函數:

void Foo::Loop1(Foo info){ 
    while (true){ 
     if (info.active){ 
      //Stuff 
     } 
    } 
} 

所以,我應該怎麼做才能通過從對象Foo其價值的變化在main功能使值active中的Loop功能是相等的。

謝謝你的幫助:)

回答

0

如果函數是靜態成員,它們應該有一個引用參數Foo&

void Loop1(Foo& info); 
void Loop2(Foo& info); 

否則線程讓你傳遞的對象的副本。

如果他們是你並不需要在所有通過實例非靜態成員:

void Foo::Loop1(){ 
    while (true){ 
     if (active){ 
      //Stuff 
     } 
    } 
} 

thread Thread1(&Foo::Loop1, info); 
thread Thread2(&Foo::Loop2, info); 
+0

SRY但兩者didnt工作:/線程只能傳遞價值,而不是參考。我嘗試了很多東西:/ – NicMaxFen

+0

確定它:)使用std :: ref時創建線程和作爲參數。我用你的例子使用Foo&info – NicMaxFen

0

std::ref返回std::reference_wrapper<T>是通過它的轉換操作符隱式可轉換到T&。當您將std::reference_wrapper<T>傳遞給按值接受T的函數時,將調用轉換運算符,並且函數的本地副本T通過其複製構造函數構造。

#include <functional> 

class Object 
{ 
    // ... 
}; 

void Func(Object obj) 
{ 
    // Some code which modifies obj 
} 

int main() 
{ 
    Object obj; 
    Func(std::ref(obj)); // <-- Conversion operator invoked, obj passed by value 
} 

更改功能以接受Foo作爲參考。