在我的示例中,執行緒 1 和 2 寫入相同的共享資源x。并且主執行緒將讀取該值。我想要結果,24即thread2 然后thread1。
我怎么能控制它?我嘗試在 1 之前定義執行緒 2 并join在兩個執行緒之后列印結果,24但結果是,但由于執行緒并行作業,因此不能保證此結果
int x = 10;
void mainThread1(){
x *= 2;
}
void mainThread2(){
x = 2;
}
int main() {
std::thread th1(mainThread1);
std::thread th2(mainThread2);
std::cout << x << std::endl; // random print 20 or 22
th1.join();
th2.join();
}
uj5u.com熱心網友回復:
大概您正在尋找的不是這里的瑣碎答案:在開始第二個執行緒之前加入第一個執行緒。您正在展示一個簡化的示例來說明更一般的情況。
由于執行緒并行作業,因此無法保證此結果
這是對的。與多個執行緒之間的相對操作順序相關的問題,以及當一個執行執行緒的效果在另一個執行執行緒中“可見”時,屬于一個相當廣泛、復雜和廣泛的 C 域,稱為“同步”。
執行緒間同步使用互斥體、條件變數和原子。就像所有其他大型 C 主題一樣,在此處對 Stackoverflow 的簡短回答中描述所有需要描述的關于同步的內容是不切實際的。那將需要頁面。因此,我將僅提供這個簡單用例如何處理同步的簡要總結,并將所有進一步的血腥細節推薦給您最喜歡的 C 教科書或參考資料,以獲取更多資訊。但這里如何做到這一點的基本大綱是:
- 定義一個互斥,條件變數和
bool標志,除x。 - 第一個執行執行緒鎖定互斥體,更新
x,設定bool標志,并通知條件變數,然后釋放互斥體。 - 第二個執行執行緒鎖定互斥鎖,然后鎖定
wait_for條件變數,條件為flag == true。 - 第二個執行執行緒更新
x并釋放互斥鎖。
這是保證您正在尋找的兩個執行執行緒之間的執行順序的經典解決方案。以上回答如何保證結果
執行緒2 然后執行緒1
在顯示的代碼中生成。
uj5u.com熱心網友回復:
您可以使用全域,condition_variable以便:
- 第二個要執行的執行緒等待它。
- 首先要執行的執行緒完成它的作業并設定它。
請注意,由于虛假喚醒,執行緒可能會從條件變數的等待中喚醒,因此您應該提供額外的機制,例如布林值,以告知notify實際發生的情況。
[演示]
#include <condition_variable>
#include <iostream>
#include <mutex>
#include <thread>
int x{10};
bool ready{false};
std::mutex m{};
std::condition_variable cv{};
void mainThread1() {
std::unique_lock<std::mutex> lk{m};
cv.wait(lk, []{ return ready; });
x *= 2;
}
void mainThread2() {
x = 2;
ready = true;
cv.notify_one();
}
int main() {
std::thread th1(mainThread1);
std::thread th2(mainThread2);
th1.join();
th2.join();
std::cout << x << "\n"; // prints 24
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/407126.html
標籤:
