在多執行緒(例如 std::thread)中,行程記憶體在執行緒之間共享。但是,這是否擴展到使用兩個不同引數呼叫的函式?
一個愚蠢的例子:
int add_two_in_ridiculous_fashion(int x) {
x ;
std::this_thread::sleep(1s);
x ;
return x;
}
當執行緒休眠時,另一個執行緒滾入并用不同的值替換 x,兩個執行緒分別回傳后者的值 1 和 2。這可能嗎?
如果是,在 C 中是否有防止這種情況的無鎖方法?
uj5u.com熱心網友回復:
不,這不會造成任何問題。每個執行緒都有自己的堆疊,區域變數和引數(x在您的情況下)在堆疊上,因此每個執行緒都是分開的。一個類的成員變數或全域變數在不同的執行緒之間共享(對于同一個物件實體)。
uj5u.com熱心網友回復:
具有自動存盤功能的變數 - 例如引數x- 每次進入其作用域時都是不同的 - 在這種情況下,每次呼叫函式時。
當函式呼叫來自不同的執行緒時如此,而且當函式從同一執行緒重新進入時,這可能發生在遞回或異步信號的情況下。
當執行緒休眠時,另一個執行緒滾入并用不同的值替換 x,兩個執行緒分別回傳后者的值 1 和 2。這可能嗎?
這是不可能的,因為每個x都是不同的物件。
c 多執行緒中何時以及如何分離記憶體?
整個記憶體空間由所有執行緒共享。
但是變數是否命名同一個物件是另一回事。正如我之前提到的,每次輸入自動變數的范圍時,它們都是不同的。執行緒區域變數在每個執行緒中命名一個不同的物件。靜態變數在所有執行緒中命名相同的物件,并且非常容易受到多執行緒錯誤的影響。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/359449.html
上一篇:Azure函式回傳唯一序列號
