簡體   English   中英

在不鎖定的情況下在不同線程中讀取(僅)相同的非原子變量是否安全?

[英]Is it safe to read(only) the same non-atomic variable in different threads without locking?

我有一個類方法,我想在不同的線程中同時讀取同一個非原子類成員。 該方法是const ,因此它不會寫入正在讀取的成員。 在這種情況下不關心任何鎖是否安全?

編輯:我應該舉一個例子:

class SomeClass()
{
    public:
        void someMethod() const;
//...
    private:
        std::string someMemeber_; // might be changed by some methods
//...
}

void SomeClass::someMethod() const
{
    std::jthread thr1([](){/*read someMember_ here*/});
    std::jthread thr2([](){/*read someMember_ here*/});
//...
}

它是安全的,前提是您可以保證在多個線程對其進行非同步訪問期間讀取的數據不會更改。

(請注意,這期間不僅包括在當線程調用您的常量法時的短暫瞬間,但時間的整個區域,當一個線程可以打電話給你的常數法。因此,例如在許多程序中,這沒有修改,允許期間可能從第一個子線程產生的那一刻開始,並在最后一個子線程退出並被join() 'd) 的那一刻結束

鑒於:

是的,該值可以通過其他方法更改,但不能在具有多個線程的方法執行期間更改。

即使您 100% 確定不會在讀取的同時發生任何修改,盲目讀取可能已被其他線程修改的非原子值本質上也不是安全的。

在從讀取線程看到修改之前,兩個線程之間必須同步

潛在的問題不僅僅是讀取過時的值。 如果編譯器可以確定在同一內存位置的兩次后續讀取之間沒有同步發生,則完全允許只讀取一次並緩存結果。

有多種方法可以完成同步,在給定場景中哪種方法最好取決於上下文。

有關更多詳細信息,請參閱https://en.cppreference.com/w/cpp/language/memory_model

但是,一旦建立了同步,任何數量的線程都可以從同一內存位置並發讀取。

我有一個類方法,我想在不同的線程中同時讀取同一個非原子類成員。 該方法是 const,因此它不會寫入正在讀取的成員。 在這種情況下不關心任何鎖是否安全?

是的,它是 100% 安全的。 我假設唯一的問題是多個線程正在讀取並且如果單個線程正在讀取代碼將是安全的。 額外的線程正在讀取相同的數據對讀取是否安全沒有影響。

數據競爭只能發生在讀取和修改之間。 因此,如果從一個線程中讀取的內容不會與任何修改競爭,那么額外的讀取也不能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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