簡體   English   中英

如何跨線程同步變量? 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM