真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

C++11std::mutex的使用-創(chuàng)新互聯(lián)

std::mutex
  • Mutex 系列類(四種)
    • std::mutex,最基本的 Mutex 類
    • std::recursive_mutex,遞歸 Mutex 類
    • std::time_mutex,定時(shí) Mutex 類。
    • std::recursive_timed_mutex,定時(shí)遞歸 Mutex
  • Lock 類(兩種)
    • std::lock_guard,與 Mutex RAII 相關(guān),方便線程對互斥量上鎖。
    • std::unique_lock,與 Mutex RAII 相關(guān),方便線程對互斥量上鎖,但提供了更好的上鎖和解鎖控制。
  • 其他類型
    • std::once_flag(提供一種方式,可以保證其實(shí)例綁定的函數(shù),能且僅能被執(zhí)行一次)
    • adopt_lock_t(假設(shè)調(diào)用方線程已擁有互斥的所有權(quán))
    • std::defer_lock_t(不獲得互斥的所有權(quán))
    • std::try_to_lock_t(嘗試獲得互斥的所有權(quán)而不阻塞)
  • 相關(guān)函數(shù)
    • std::try_lock,嘗試同時(shí)對多個(gè)互斥量上鎖。
    • std::lock,可以同時(shí)對多個(gè)互斥量上鎖。
    • std::call_once,如果多個(gè)線程需要同時(shí)調(diào)用某個(gè)函數(shù),call_once 可以保證多個(gè)線程對該函數(shù)只調(diào)用一次。

為羅平等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計(jì)制作服務(wù),及羅平網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為成都網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)、外貿(mào)營銷網(wǎng)站建設(shè)、羅平網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會得到認(rèn)可,從而選擇與我們長期合作。這樣,我們也可以走得更遠(yuǎn)!
Mutex 系列類(四種)
  • std::mutex,最基本的 Mutex 類

獨(dú)占互斥量,只能加鎖一次
std::mutex 是C++11 中最基本的互斥量,std::mutex 對象提供了獨(dú)占所有權(quán)的特性——即不支持遞歸地對 std::mutex 對象上鎖,而 std::recursive_lock 則可以遞歸地對互斥量對象上鎖。


std::mutex成員函數(shù):

  • 構(gòu)造函數(shù),std::mutex不允許拷貝構(gòu)造,也不允許 move 拷貝,最初產(chǎn)生的 mutex 對象是處于 unlocked 狀態(tài)的。
  • lock(),調(diào)用線程將鎖住該互斥量
  • unlock(), 解鎖,釋放對互斥量的所有權(quán)。
  • try_lock(),嘗試鎖住互斥量,如果互斥量被其他線程占有,則當(dāng)前線程也不會被阻塞。

  • std::recursive_mutex,遞歸 Mutex 類

遞歸的獨(dú)占互斥量,允許同一個(gè)線程,同一個(gè)互斥量,多次被lock,用法和非遞歸的一樣 跟windows的臨界區(qū)是一樣的,但是調(diào)用次數(shù)是有上限的,效率也低一些
和 std::mutex 不同的是,
std::recursive_mutex 允許同一個(gè)線程對互斥量多次上鎖(即遞歸上鎖),來獲得對互斥量對象的多層所有權(quán),
std::recursive_mutex 釋放互斥量時(shí)需要調(diào)用與該鎖層次深度相同次數(shù)的 unlock(),可理解為 lock() 次數(shù)和 unlock() 次數(shù)相同.


  • std::time_mutex,定時(shí) Mutex 類。

帶超時(shí)的互斥量,獨(dú)占互斥量 這個(gè)就是拿不到鎖會等待一段兒時(shí)間,但是超過設(shè)定時(shí)間,就繼續(xù)執(zhí)行
std::time_mutex 比 std::mutex 多了兩個(gè)成員函數(shù),try_lock_for(),try_lock_until()。

template< class Rep, class Period >bool try_lock_for( const
std::chrono::duration& timeout_duration ); 
//  (C++11 起) 
template< class Rep, class Period >bool try_lock_for( const
std::chrono::duration& timeout_duration ); 
//  (C++11 起)
  • try_lock_for:嘗試鎖定互斥,若互斥在指定的時(shí)限時(shí)期中不可用則返回。
  • try_lock_until:嘗試鎖定互斥,若直至抵達(dá)指定時(shí)間點(diǎn)互斥不可用則返回。

參數(shù)
timeout_duration - 要阻塞的大時(shí)長
返回值
若成功獲得鎖則為 true ,否則為 false 。
異常
執(zhí)行期間時(shí)鐘、時(shí)間點(diǎn)或時(shí)長可能拋出的異常(標(biāo)準(zhǔn)庫提供的時(shí)鐘、時(shí)間點(diǎn)和時(shí)長決不拋出)


  • std::recursive_timed_mutex,定時(shí)遞歸 Mutex

帶超時(shí)的,遞歸的,獨(dú)占互斥量,允許同一個(gè)線程,同一個(gè)互斥量,多次被lock,用法和非遞歸的一樣


Lock 類(兩種)
  • std::lock_guard,與 Mutex RAII 相關(guān),方便線程對互斥量上鎖。
  • lock_guard功能與std::mutex的lock與unlock功能相同。 不同的是,lock_guard析構(gòu)時(shí)會自動(dòng)解鎖,使用時(shí)無須unlock。這就需要我們將共享資源的訪問封裝成盡可能小的函數(shù),避免加鎖時(shí)間過長。
  • 為了防止在線程使用mutex加鎖后異常退出導(dǎo)致死鎖的問題,建議使用lock_guard代替mutex.
  • std::lock_guard類的構(gòu)造函數(shù)禁用拷貝構(gòu)造,且禁用移動(dòng)構(gòu)造。std::lock_guard類除了構(gòu)造函數(shù)和析構(gòu)函數(shù)外沒有其它成員函數(shù)

注意,lock_guard對象不以任何方式管理互斥對象的生存期:互斥對象的生存期至少要延長到鎖它的lock_guard被銷毀。


  • std::unique_lock,與 Mutex RAII 相關(guān),方便線程對互斥量上鎖,但提供了更好的上鎖和解鎖控制。
  • unique_lock是個(gè)類模板,工作中,一般lock_guard(推薦使用);lock_guard取代了mutex的lock()和unlock();
  • unique_locklock_guard靈活很多,效率上差一點(diǎn),內(nèi)存占用多一點(diǎn)。
  • std::unique_lock可以在構(gòu)造時(shí)傳遞第二個(gè)參數(shù)用于管理互斥量,且能傳遞不同域中互斥量所有權(quán)。
  • unique_lock私有成員為指針 _Mutex /*_Pmtx,指向傳遞進(jìn)來的互斥量,lock_guard私有成員為引用_Mutex& _MyMutex,引用傳遞進(jìn)的互斥量。這就決定了unique_lock能夠?qū)崿F(xiàn)傳遞互斥量的功能。
  • unique_lock的用法比較多,如果對鎖的需求比較簡單推薦使用lock_guard。當(dāng)需要超時(shí)或者手動(dòng)解鎖等功能,可以考慮使用unique_lock

不同的情況可使用對應(yīng)的構(gòu)造創(chuàng)建對象

unique_lock(mutex, adopt_lock_t) //傳遞被使用過的mutex,且已經(jīng)被上過鎖,通過。無上鎖動(dòng)作,不阻塞。

unique_lock(mutex, defer_lock_t) //傳遞被使用過的mutex,未被上過鎖。無上鎖動(dòng)作,不阻塞。

unique_lock(mutex, try_to_lock_t) //任何狀態(tài)的mutex。嘗試上鎖,不阻塞。

unique_lock(_Mutex& _Mtx, const chrono::duration<_Rep, _Period>&
_Rel_time) //在指定時(shí)間長內(nèi)嘗試獲取傳遞的mutex的鎖返回。若無法獲取鎖,會阻塞到指定時(shí)間長。

unique_lock(mutex_type& m,std::chrono::time_pointconst& absolute_time) //在給定時(shí)間點(diǎn)嘗試獲取傳遞的mutex鎖返回。若無法獲取鎖,會阻塞到指定時(shí)間點(diǎn)。

unique_lock(unique_lock&& _Other)
//將已經(jīng)創(chuàng)建的unique_lock鎖的所有權(quán)轉(zhuǎn)移到新的鎖。保持之前鎖的狀態(tài),不阻塞 ```

unique_lock的成員函數(shù)
unique_lock除了擁有跟std::mutex一樣的三個(gè)成員函數(shù)意外,還提供release()函數(shù)。
release()返回它所管理的mutex對象指針,并釋放所有權(quán);也就是說,這個(gè)unique_lock和mutex不再有關(guān)系。嚴(yán)格區(qū)分unlock()與release()的區(qū)別,不要混淆。

  std::unique_locksbguard(my_mutex);
      std::mutex *ptx = sbguard.release(); //現(xiàn)在你有責(zé)任自己解鎖了
      msgRecvQueue.push_back(i);
      ptx->unlock(); //自己負(fù)責(zé)mutex的unlock了

unique_lock所有權(quán)的傳遞

std::unique_lockstd::mutex sbguard(my_mutex);//所有權(quán)概念
std::unique_lockstd::mutex sbguard1(my_mutex);
std::unique_lockstd::mutex sbguard2(sbguard1);//此句是非法的,復(fù)制所有權(quán)是非法
//sbguard擁有my_mutex的所有權(quán);sbguard可以把自己對mutex(my_mutex)的所有權(quán)轉(zhuǎn)移給其他的unique_lock對象;
//所以unique_lock對象這個(gè)mutex的所有權(quán)是可以轉(zhuǎn)移,但是不能復(fù)制。

所有權(quán)的傳遞的方法

方法1 :std::move()
方法2:return std:: unique_lockstd::mutex


其他類型
  • std::once_flag(提供一種方式,可以保證其實(shí)例綁定的函數(shù),能且僅能被執(zhí)行一次)
  • adopt_lock_t(假設(shè)調(diào)用方線程已擁有互斥的所有權(quán))
  • Value used as possible argument to the constructor of unique_lock or lock_guard.

  • objects constructed with adopt_lock do not lock the mutex object on construction, assuming instead that it is already locked by the current thread.

  • The value is a compile-time constant that carries no state, and is merely used to disambiguate between constructor signatures.

  • adopt_lock_t is an empty class.

  • std::defer_lock_t(不獲得互斥的所有權(quán))
  • Value used as possible argument to unique_lock’s constructor.

  • unique_lock objects constructed with defer_lock do not lock the mutex object automatically on construction, initializing them as not owning a lock.

  • The value is a compile-time constant that carries no state, and is merely used to disambiguate between constructor signatures.

  • defer_lock_t is an empty class.

  • std::try_to_lock_t(嘗試獲得互斥的所有權(quán)而不阻塞)
  • Value used as possible argument to unique_lock’s constructor.

  • unique_lock objects constructed with try_to_lock attempt to lock the mutex object by calling its try_lock member instead of its lock member.

  • The value is a compile-time constant that carries no state, and is merely used to disambiguate between constructor signatures.


相關(guān)函數(shù)
std::try_lock,嘗試同時(shí)對多個(gè)互斥量上鎖。
std::lock,可以同時(shí)對多個(gè)互斥量上鎖。
std::call_once,如果多個(gè)線程需要同時(shí)調(diào)用某個(gè)函數(shù),call_once 可以保證多個(gè)線程對該函數(shù)只調(diào)用一次。
templatevoid call_once (once_flag&flag, Fn&& fn, Args&&... args);

flag:僅可執(zhí)行一次的對象,其生命周期要比所在的線程長
Fn:執(zhí)行函數(shù)
args:執(zhí)行函數(shù)的可變參數(shù)

當(dāng)多個(gè)線程使用同一個(gè)flag對象去調(diào)用函數(shù)call_once時(shí),僅有一個(gè)線程可以真正的完成對函數(shù)Fn的調(diào)用,其他的線程會被阻塞,直到函數(shù)Fn返回.

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧


本文題目:C++11std::mutex的使用-創(chuàng)新互聯(lián)
鏈接分享:http://weahome.cn/article/pgoej.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部