條件變數和原子型式

2021-07-11 13:48:31 字數 1661 閱讀 8725

一.std::condition_variable類

必須與std::unique_lock配合使用

std::condition_variable_any類

更加通用的條件變數,可以與任意型式的互斥鎖配合使用,相比前者使用時會有額外的開銷

多執行緒通訊同步原語

阻塞乙個或多個執行緒至收到來自其他執行緒的通知,超時或發生虛假喚醒

兩者具有同樣的成員函式,且在等待條件變數前都必須要獲得相應的鎖

二.成員函式notify_one():通知乙個等待執行緒

原型:void motify_one() noexcept;

成員函式notify_all():通知全部等待執行緒

原型:void motify_one() noexcept;

成員函式wait():阻塞當前執行緒至被喚醒

原型:templatevoid wait( lock & lock );

原型:templatevoid wait( lock & lock, predicate p );

三.成員函式wait_for():阻塞至被喚醒或超過指定時長

原型: templatecv_status wait_for( lock& lock, const chrono::duration& rtime );

原型:templatebool wait_for( lock& lock, const chrono::duration& rtime, predicate p );

成員函式wait_until():阻塞至被喚醒或到達指定時點

原型:templatecv_status wait_until( lock & lock, const chrono::time_point& atime);

原型:templatebool wait_until( lock& lock, const chrono::time_point& atime, predicate p );

四.#include #include #include #include std::mutex x;

std::condition_variable cond;

bool ready = false;

bool isready()

void run( int no )

int main()

// 離開作用域,自動解鎖;可將此復合語句塊實現為函式

// 基於區間的迴圈結構,對屬於threads陣列的所有元素t,執行迴圈體

for( auto & t: threads )

t.join();

return 0;

}原子型式

一.使用方法

使用atomic模板定義原子物件

使用預定義標準原子型式:atomic_bool、atomic_char、atomic_int、atomic_uint、atomic_long、atomic_wchar_t等等

意義:輕量級,支援單變數上的原子操作

二.三.#include #include #include int n = 0;

std::atomica( 0 );

void addatomically( int m )

void add( int m )

int main()

原子變數與原子操作

1.原子操作的速度要快於臨界區,event,互斥量,如果多個執行緒同時寫乙個變數時,最方便的就是原子操作。原子操作函式,解決多執行緒安全 2.原子變數也是為了解決執行緒衝突問題,如果兩個執行緒同時訪問同乙個變數,乙個執行緒改變了這個變數,另乙個執行緒就會出現一些bug。3.release和debug...

原子變數的操作

原子操作,顧名思義,就是說像原子一樣不可再細分。乙個操作是原子操作,意思就是說這個操作是以原子的方式被執行,要一口氣執行完,執行過程不能夠被os的其他行為打斷,是乙個整體的過程,在其執行過程中,os的其它行為是插不進來的。原子整數操作的使用 常見的用途是計數器,因為計數器是乙個很簡單的操作,所以無需...

互斥鎖和條件變數

互斥瑣 定義 指代相互排斥,最基本的同步形式。用於保護臨界區,以保證任何時刻只有乙個執行緒或乙個程序在執行其中的 上鎖 pthread mutex lock 臨界區解鎖 pthread mutex unlock 條件變數 定義 用於等待訊號,同步的另一種手段。每乙個條件變數總有乙個互斥瑣與之關聯。等...