2017-03-29 118 views
0

我有一個函數(messageArrived),調用的是一個函數(setAnimation)在一個新的線程內。我如何訪問在messageArrived函數內定義的布爾值並在第二個線程中訪問它?主線程從第二個線程訪問變量

如果有新消息我想終止第二個線程(setAnimation)。我認爲,布爾是唯一的方法來「終止」一個線程。

#include <thread> 

bool start = false; 

void setAnimation(std::string msg){ 
    start = true; 
    while(start){ 
     //do something 
    } 
    return; 
}  

int messageArrived(std::string message){ 
    start = false; 
    std::thread t1(setAnimation, message); 
    t1.detach(); 
    return 1; 
} 

上面的代碼只是一個例子來澄清我的問題。

+1

與任何其他函數一樣,您需要通過指針/引用傳遞函數。 – NathanOliver

+0

局部變量侷限於它們在其中定義的範圍。線程不會更改它。 –

+2

對此沒有什麼意義,因爲'messageArrived'返回時'start'不再存在,所以沒有什麼可以訪問的。 – molbdnilo

回答

1

創建線程時,可以通過引用使用std::ref來傳遞變量。但是,您仍然需要在函數外部使用變量,否則它將超出範圍。

std::thread t1(setAnimation, message, std::ref(myVariable)); 
+0

如果布爾值在main中設置爲false,那麼第二個線程中的whileloop會發現變化? – Janoshh

+0

這將導致線程對變量超出範圍的引用,並且OP將具有*未定義的行爲*。 –

+0

@Janoshh它是對bool值的引用,所以是的,這個改變在線程內是可見的。 – AlexG