[英]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.