簡體   English   中英

創建/加入線程時的隱式同步

[英]Implicit synchronization when creating/joining threads

考慮到創建/加入線程時隱含的同步,這個代碼工作的x類型需要什么樣的最小框架: std::atomic volatile 沒有?

#include <thread>
#include <cassert>
int main() {
    int x = 123; // ***
    std::thread( [ & ] { assert( x == 123 ); x = 321; } ).join();
    assert( x == 321 );
    return 0;
}

std::thread的構造函數的調用是同步的,並且在調用線程函數的副本(30.3.1.2/6)之前發生。

thread::join提供了類似的同步保證:線程的完成在join返回之前發生(30.3.1.4/7)。

您的代碼創建一個線程並立即加入它。 雖然你的lambda通過引用捕獲,但是沒有並發(代碼按順序運行),並且std::thread提供的保證確保你不需要任何特殊的框架來保護x 斷言永遠不會失敗。

假設您的代碼片段不同,因此您實際上具有某種類型的並發訪問權限,則必須使用std::atomic或互斥鎖。 volatile最明確地不夠(除了巧合)。

暫無
暫無

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

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