來源自我的博客
http://www.yingzinanfei.com/2017/03/07/cduoxianchengxiangjie/
atomic atomic atomic_boolatomic_intatomic_longatomic_flagthread thread類創建線程,接受函數和函數參數作為thread類參數mutex mutex類,互斥量 mutex 最基本的Mutex類recursive_mutex 遞歸Mutex類,允許同一線程對互斥量多次上鎖(遞歸上鎖),來獲得互斥量對象的多層所有權。釋放互斥量時需要調用與該鎖層次深度相同次數的unlock()time_mutex 定時Mutex類 try_lock_for() 接受一個時間范圍,表示在這一段時間范圍之內線程如果沒有獲得鎖則被阻塞住,如果在此期間其他線程釋放了鎖,則該線程可以獲得互斥量的鎖,如果超時返回falsetry_lock_until() 接受一個時間點作為參數,在指定時間點未到來之前線程如果沒有獲得鎖則被阻塞住,如果在此期間其他線程釋放了鎖,則該線程可以獲得對互斥量的鎖,如果超時返回falserecursive_timed_mutex 定時遞歸Mutex類Lock類 lock_guard 與Mutex RAII相關,方便線程對互斥量上鎖 模板類,template class lock_guard;lock_guard對象通常用于管理某個鎖對象在某個lock_guard對象的聲明周期內,它所管理的鎖對象會一直保持上鎖狀態。而lock_guard的生命周期結束之后,它所管理的鎖對象會被解鎖。不負責管理Mutex對象的生命周期,只是簡化了Mutex對象的上鎖和解鎖操作,方便線程對互斥量上鎖。構造函數explicit lock_guard(mutex_type& m);
locking初始化,在構造時對m進行上鎖lock_guard(mutex_type& m, adopt_lock_t tag);
adopting初始化,在Mutex對象m已經被當前線程鎖住后調用lock_guard(const lock_guard&) = delete;
拷貝構造和移動構造均被禁用unique_lock 與Mutex RAII相關,方便線程對互斥量上鎖,但提供了更好的上鎖和解鎖控制 以獨占所有權的方式管理mutex對象的上鎖和解鎖操作構造函數 unique_lock() noexcept;
默認構造函數,不管理任何Mutex對象explicit unique_lock(mutex_type& m);
locking初始化,管理Mutex對象m,并嘗試調用m.lock()對Mutex對象進行上鎖,如果此時另外某個unique_lock對象已經管理了該Mutex對象m,則當前線程將會被阻塞unique_lock(mutex_type& m, try_to_lock_t tag);
try_locking初始化,嘗試上鎖不成功時不會阻塞當前線程unique_lock(mutex_type&m, defer_lock_t tag) noexcept;
deferred初始化,初始化時并不鎖住Mutex對象,m應該是一個沒有當前線程鎖住的Mutex對象unique_lock(mutex_type&m, adopt_lock_t tag);
adopting初始化,m應該是一個已經被當前線程鎖住的Mutex對象。template<class Rep, class Period> unique_lock(mutex_type& m, const chrono::duration<Rep, Period>& rel_time);
locking一段時間,試圖調用m.try_lock_for來鎖住Mutex對象一段時間(rel_time)template<class Clock, class Duration> unique_lock(mutex_type& m, const chrono::time_point<Clock, Duration>& abs_time);
locking到某個時間點(abs_time)之前unique_lock(const unique_lock&) = delete;
拷貝構造被禁用unique_lock(unique_lock&& x);
移動構造被禁用其他類型 once_flagadopt_lock_tdefer_lock_ttry_to_lock_t函數 lock() 可以同時對多個互斥量上鎖 如果該互斥量當前沒有被鎖住,則調用線程將該互斥量鎖住,直到調用unlock之前,該線程一直擁有該鎖如果當前互斥量被其他線程鎖住,則當前的調用線程被阻塞住如果當前互斥量被當前調用線程鎖住,則會發生死鎖(deadlock)try_lock() 嘗試同時對多個互斥量上鎖,如果互斥量被其他線程占有,則當前線程也不會被阻塞 如果該互斥量當前沒有被鎖住,則調用線程將該互斥量鎖住,直到調用unlock之前,該線程一直擁有該鎖如果當前互斥量被其他線程鎖住,則當前的調用線程返回false,并不會被阻塞掉如果當前互斥量被當前調用線程鎖住,則會發生死鎖(deadlock)unlock() 解鎖condition_variable 條件變量。當condition_variable對象的某個wait函數被調用的時候,它使用unique_lock(通過mutex)來鎖住當前線程。當前線程會一直阻塞,直到另外一個線程在相同的condition_variable對象上調用了notification函數來喚醒當前線程 condition_variable類 通常使用unique_lock來等待 構造函數 condition_variable();
condition_variable(const codition_variable&) = delete;
拷貝構造函數被禁用condition_variable::wait()函數 void wait(unique_lock<mutex>& lck);
當前線程調用wait()后將阻塞,直到另外某個線程調用notify_*喚醒當前線程。在線程被阻塞時,該函數會自動調用lck.unlock()釋放鎖,使得其他阻塞在鎖競爭上的線程得以繼續執行。另外,一旦當前線程獲得通知,wait()函數也是自動調用lck.lock(),使得lck的狀態和wait函數被調用時相同template<class PRedicate> void wait(unique_lock<mutex>& lck, Predicate pred);
只有當pred條件為false時調用wait()都會阻塞當前線程,并且在收到其他線程的通知后只有當pred為true時才會被解除阻塞。類似于`while(!pred()) wait(lck);condition_variable::wait_for()函數 可以指定一個時間段condition_variable::wait_until()函數 可以指定一個時間點condition_variable::notify_one()介紹 喚醒某個等待線程。如果當前沒有等待線程,則該函數什么也不做。如果同時存在多個等待線程,則喚醒某個線程是不確定的condition_variable::notify_all()介紹 喚醒所有等待線程。condition_variable_any 通常使用另外的lockable類型來等待。wait函數可以接受任何lockable參數cv_status 枚舉類型 cv_status::no_timeout wait_for或者wait_until沒有超時,即在規定的時間段內線程收到了通知cv_status::timeout wait_for或者wait_until超時notify_all_at_thread_exitfuture Provider類 promise promise對象可以保存某一類型T的值,該值可被future對象讀?。赡茉诹硗庖粋€線程中),因此promise也提供了一種線程同步的手段在promise對象構造時可以和一個共享狀態(通常是std::future)相關聯,并可以在相關聯的共享狀態(std::future)上保存一個類型為T的值可以通過get_future來獲取與該promise對象相關聯的fuure對象,調用該函數之后,兩個對象共享相同的共享狀態(shared state)promise對象是異步Provider,它可以在某一時刻設置共享狀態的值future對象可以異步返回共享狀態的值,或者在必要的情況下阻塞調用者并等待共享狀態標志變為ready,然后才能獲取共享狀態的值。構造函數 promise();
默認構造函數,初始化一個空的共享狀態template <class Alloc> promise(allocator_arg_t aa, const Alloc& alloc);
帶自定義內存分配器的構造函數,與默認構造函數類似,但是使用自定義分配器來分配共享狀態promise(const promise&) = delete;
拷貝構造函數被禁用promise(promise&& x) noexcept;
移動構造函數promise的Operator=沒有拷貝語義,即普通的賦值操作被禁用。operator=只有move語義,所以promise對象是禁止拷貝的成員函數 promise::get_future()
該函數返回一個與promise共享狀態相關聯的future。返回的future對象可以訪問由promise對象設置在共享狀態上的值或者某個異常對象。只能從promise共享狀態獲取一個future對象。在調用該函數之后,promise對象通常會在某個時間點準備好(設置一個值或者一個異常對象),如果不設置值或者異常,promise對象在析構時會自動地設置一個future_error異常(broken_promise)來設置其自身的準備狀態promise::set_value()
設置共享狀態的值, 此后promise的共享標志變為readypromise::set_exception()
為promise設置異常,此后promise的共享狀態標志變為readypackage_taskFutures類 futureshared_future其他類型 future_errorfuture_errcfuture_statuslaunchasync()函數future_category()函數新聞熱點
疑難解答
圖片精選