![](/img/trans.png)
[英]What is the correct way to sync variables between two threads in C++?
[英]How do i sync variables across threads? C++
讓我說我有A)全局變量B)局部變量,但另一個線程有一個ptr
讓我們說我有這個代碼
thread2(&localVar);//now thread2 can modify it
localVar=0;
globalVar=0;
while(1){
mutex.lock();
cout << (globalVar && localVar ? "Both true" : "fail");
mutex.unlock();
Sleep(1000)
}
這是正確和安全的嗎? 我不記得了。 如果是我的問題是C ++如何知道localVar和globalVar可能已被修改? 如果你說因為互斥鎖定/解鎖那么我的問題是為什么? 當調用任何函數時,C ++是否認為變量可能已被修改並需要重新加載到寄存器中?
如果這不安全那么是什么讓它不安全? (我懷疑如果不是只有localVar是不安全的),我該如何糾正呢?
你做的事情要復雜得多。 您的責任是確保不會發生對變量的沖突訪問 。
定義: 如果它們可以同時發生並且至少一個是寫訪問,則對給定內存位置的兩次訪問會發生沖突 。
所以:
為了確保永遠不會發生這種情況,您可以使用mutex
,或者設計程序以便只讀取線程之間共享的變量。 還有許多其他可能的策略。
如果我正確理解你的不完整代碼: localVar
在兩個線程中同時修改。 行為未定義。 任何事情都可能發生。
這是正確和安全的嗎?
沒有。
修復:在創建第二個線程之前初始化localVar和globalVar。
你已經將localVar(在本地堆棧上?local var建議在范圍內的堆棧上)暴露給另一個線程是很麻煩的。 如果此localVar在堆棧上,那么請確保不要讓它超出范圍。
您是否在另一個線程上使用相同的互斥鎖,以保護讀/寫訪問? 如果是,那么這將走向安全。
這不是“C ++知道localVar和globalVar可能已被修改過嗎?”的問題:C ++不知道。 對於這種情況,如上所述,所有關於使用互斥鎖來正確保護對所有共享值的所有訪問都是如此。 如果兩個線程都使用互斥鎖,則一次只允許一個線程通過受保護的代碼。 嘗試鎖定互斥鎖的任何其他線程將“停止並等待”,直到鎖定被釋放。
因此,通過圍繞互斥體對這對值的讀取,您將走上正確的軌道。
當調用任何函數時,C ++是否認為變量可能已被修改並需要重新加載到寄存器中?
作為一般規則,是的。
我認為,第一次獲取局部變量的地址時,它變得易變,並且所有讀取和寫入都在內存中執行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.