併發程式設計(4)同步併發操作

2022-03-14 19:57:14 字數 1241 閱讀 9067

一、主要涉及

等待事件

帶有期望的等待一次性事件

在限定時間內等待

使用同步操作簡化**

二、等待乙個條件或者事件

1、選擇是在等待執行緒在檢查間隙,使用 std::this_thread::sleep_for() 進行週期性的間歇;

2、(也是優先的選擇)是,使用c++標準庫提供的工具去等待事件的發生。通過另一線程觸發等待事件的機制是最基本的喚醒方式(例如:流水線上存在額外的任務時),這種機制就稱為「條件變數」。從概念上來說,乙個條件變數會與多個事件或其他條件相關,並且乙個或多個執行緒會等待條件的達成。

c++標準庫對條件變數有兩套實現: std::condition_variable 和 std::condition_variable_any

展示了一種使用條件變數做喚醒的方式:

std::mutex mut;

std::queue

data_queue; //

1std::condition_variable data_cond;

//準備資料線程

void

data_preparation_thread()

}//處理資料線程

void

data_processing_thread()

//檢測佇列是否有資料寫入了

); //

5  data_chunk data=data_queue.front();//對資料處理

data_queue.pop();

lk.unlock(); //6

process(data);

if(is_last_chunk(data))

break

;  }

}

wait()會去檢查這些條件(通過呼叫所提供的lambda函式),當條件滿足(lambda函式返回true)

時返回。如果條件不滿足(lambda函式返回false),wait()函式將解鎖互斥量,並且將這個執行緒

(上段提到的處理資料的執行緒)置於阻塞或等待狀態。

條件變數時,處理資料的執行緒從睡眠狀態中甦醒,重新獲取互斥鎖,並且對條件再次檢查,在條件滿足的情況下,從wait()返回並繼續持有鎖。當條件不滿足時,執行緒將對互斥量解鎖,並且重新開始等待。這就是為什麼用 std::unique_lock (4)而不使用 std::lock_guard ——等待中的執行緒必須在等待期間解鎖互斥量,並在這這之後對互斥量再次上鎖。

三、期望

四、訊號量

併發程式設計4

1 gil gil是乙個全域性直譯器鎖,是一種互斥鎖 乙個python.exe程序中只有乙份直譯器,如果職工程序開啟了多個執行緒都要執行 多執行緒之間要競爭直譯器,一旦競爭就會出現問題 gil帶來的問題是同一時間只有乙個執行緒可以訪問直譯器 好處是保證了多執行緒的資料安全 thread safe 執...

併發程式設計四(4) 執行緒同步 Condition

import threading import time def consumer cond with cond print consumer before wait cond.wait 等待消費 相當於程序就緒狀態 print consumer after wait def producer co...

java併發程式設計 執行緒同步

sysynchronized關鍵字可以修飾方法 塊,但不能修飾構造器 成員變數等。當sysynchronized關鍵字同來修飾方法和 塊時,能夠保證同一時刻最多只有乙個執行緒執行該段 或方法。防止當有兩個執行緒併發修改同乙個檔案時可能會造成異常。同步 塊語法 synchronized obj 複製 ...