欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺談C++11中的幾種鎖

 更新時(shí)間:2022年01月25日 11:23:48   作者:fzzjoy  
本文主要介紹了C++11中的幾種鎖,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

互斥鎖(mutex)

可以避免多個(gè)線程在某一時(shí)刻同時(shí)操作一個(gè)共享資源,標(biāo)準(zhǔn)C++庫(kù)提供了std::unique_lock類模板,實(shí)現(xiàn)了互斥鎖的RAII慣用語(yǔ)法:
eg:

std::unique_lock<std::mutex> lk(mtx_sync_);

條件鎖(condition_variable)

條件鎖就是所謂的條件變量,某一個(gè)線程因?yàn)槟硞€(gè)條件未滿足時(shí)可以使用條件變量使該程序處于阻塞狀態(tài)。一旦條件滿足了,即可喚醒該線程(常和互斥鎖配合使用),喚醒后,需要檢查變量,避免虛假喚醒。
eg:

線程1:

// wait ack
{
? ? std::unique_lock<std::mutex> lk(mtx_sync_);
? ? if (!cv_sync_.wait_for(lk, 1000ms, [this](){return sync_; })) // wait for 1s
? ? {
? ? ? ? // wait failed
? ? ? ? printf("wait for notify timeout [%d].\n", cnt);
? ? ? ? return false;
? ? }
? ? else
? ? {
? ? ? ? return true;
? ? }
}

線程2:

{
?? ?std::unique_lock<std::mutex> lk(mtx_sync_);
?? ?sync_ = true;
}
// 通知前解鎖,可以避免喚醒線程后由于互斥鎖的關(guān)系又進(jìn)入了阻塞階段
cv_sync_.notify_one();

自旋鎖(不推薦使用)

自旋鎖是一種基礎(chǔ)的同步原語(yǔ),用于保障對(duì)共享數(shù)據(jù)的互斥訪問(wèn)。與互斥鎖的相比,在獲取鎖失敗的時(shí)候不會(huì)使得線程阻塞而是一直自旋嘗試獲取鎖。當(dāng)線程等待自旋鎖的時(shí)候,CPU不能做其他事情,而是一直處于輪詢忙等的狀態(tài)。自旋鎖主要適用于被持有時(shí)間短,線程不希望在重新調(diào)度上花過(guò)多時(shí)間的情況。實(shí)際上許多其他類型的鎖在底層使用了自旋鎖實(shí)現(xiàn),例如多數(shù)互斥鎖在試圖獲取鎖的時(shí)候會(huì)先自旋一小段時(shí)間,然后才會(huì)休眠。如果在持鎖時(shí)間很長(zhǎng)的場(chǎng)景下使用自旋鎖,則會(huì)導(dǎo)致CPU在這個(gè)線程的時(shí)間片用盡之前一直消耗在無(wú)意義的忙等上,造成計(jì)算資源的浪費(fèi)。

// 用戶空間用 atomic_flag 實(shí)現(xiàn)自旋互斥
#include <thread>
#include <vector>
#include <iostream>
#include <atomic>
?
std::atomic_flag lock = ATOMIC_FLAG_INIT;
?
void f(int n)
{
? ? for (int cnt = 0; cnt < 100; ++cnt) {
? ? ? ? while (lock.test_and_set(std::memory_order_acquire)) ?// 獲得鎖
? ? ? ? ? ? ?; // 自旋
? ? ? ? std::cout << "Output from thread " << n << '\n';
? ? ? ? lock.clear(std::memory_order_release); ? ? ? ? ? ? ? // 釋放鎖
? ? }
}
?
int main()
{
? ? std::vector<std::thread> v;
? ? for (int n = 0; n < 10; ++n) {
? ? ? ? v.emplace_back(f, n);
? ? }
? ? for (auto& t : v) {
? ? ? ? t.join();
? ? }
}

遞歸鎖(recursive_mutex)

recursive_mutex 類是同步原語(yǔ),能用于保護(hù)共享數(shù)據(jù)免受從個(gè)多線程同時(shí)訪問(wèn)。

recursive_mutex 提供排他性遞歸所有權(quán)語(yǔ)義:

  • 調(diào)用方線程在從它成功調(diào)用 lock 或 try_lock 開(kāi)始的時(shí)期里占有 recursive_mutex 。此時(shí)期間,線程可以進(jìn)行對(duì) lock 或 try_lock 的附加調(diào)用。所有權(quán)的時(shí)期在線程調(diào)用 unlock 匹配次數(shù)時(shí)結(jié)束。
  • 線程占有 recursive_mutex 時(shí),若其他所有線程試圖要求 recursive_mutex 的所有權(quán),則它們將阻塞(對(duì)于調(diào)用 lock )或收到 false 返回值(對(duì)于調(diào)用 try_lock )。
  • 可鎖定 recursive_mutex 次數(shù)的最大值是未指定的,但抵達(dá)該數(shù)后,對(duì) lock 的調(diào)用將拋出 std::system_error 而對(duì) try_lock 的調(diào)用將返回 false 。
  • 若 recursive_mutex 在仍為某線程占有時(shí)被銷毀,則程序行為未定義。 recursive_mutex 類滿足互斥 (Mutex) 和標(biāo)準(zhǔn)布局類型 (StandardLayoutType) 的所有要求。

 到此這篇關(guān)于淺談C++11中的幾種鎖的文章就介紹到這了,更多相關(guān)C++11 鎖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++使用easyX庫(kù)實(shí)現(xiàn)三星環(huán)繞效果流程詳解

    C++使用easyX庫(kù)實(shí)現(xiàn)三星環(huán)繞效果流程詳解

    EasyX是針對(duì)C/C++的圖形庫(kù),可以幫助使用C/C++語(yǔ)言的程序員快速上手圖形和游戲編程。這篇文章主要介紹了C++使用easyX庫(kù)實(shí)現(xiàn)三星環(huán)繞效果,需要的可以參考一下
    2022-10-10
  • Objective-C不帶加減號(hào)的方法實(shí)例

    Objective-C不帶加減號(hào)的方法實(shí)例

    顯而易見(jiàn)的事實(shí)是,Objective-C 中,+ 表示類方法,- 表示實(shí)例方法,這篇文章主要給大家介紹了關(guān)于Objective-C不帶加減號(hào)的相關(guān)資料,需要的朋友可以參考下
    2021-06-06
  • C++詳解非類型模板參數(shù)Nontype與Template及Parameters的使用

    C++詳解非類型模板參數(shù)Nontype與Template及Parameters的使用

    除了類型可以作為模板參數(shù),普通值也可以作為模板函數(shù),即非類型模板參數(shù)(Nontype Template Parameters)。下面讓我們一起了解一下
    2022-06-06
  • C++通過(guò)CryptoPP計(jì)算Hash值的過(guò)程詳解

    C++通過(guò)CryptoPP計(jì)算Hash值的過(guò)程詳解

    Crypto++ (CryptoPP) 是一個(gè)用于密碼學(xué)和加密的C++庫(kù),它是一個(gè)開(kāi)源項(xiàng)目,提供了大量的密碼學(xué)算法和功能,本文小編給大家介紹了C++通過(guò)CryptoPP計(jì)算Hash值的過(guò)程,文中通過(guò)代碼示例給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-11-11
  • 詳解c++實(shí)現(xiàn)信號(hào)槽

    詳解c++實(shí)現(xiàn)信號(hào)槽

    這篇文章主要為大家介紹了c++實(shí)現(xiàn)信號(hào)槽,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2021-12-12
  • C++四種case的詳細(xì)介紹小結(jié)

    C++四種case的詳細(xì)介紹小結(jié)

    本文主要介紹了C++四種case的詳細(xì)介紹小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • QT6安裝圖文教程(兼容QT5、QT4)

    QT6安裝圖文教程(兼容QT5、QT4)

    本文主要介紹了QT6安裝圖文教程(兼容QT5、QT4),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • C語(yǔ)言編程PAT乙級(jí)學(xué)習(xí)筆記示例分享

    C語(yǔ)言編程PAT乙級(jí)學(xué)習(xí)筆記示例分享

    這篇文章主要為大家介紹了C語(yǔ)言編程PAT乙級(jí)學(xué)習(xí)筆記實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • C++超詳細(xì)實(shí)現(xiàn)二叉樹(shù)的遍歷

    C++超詳細(xì)實(shí)現(xiàn)二叉樹(shù)的遍歷

    本章將會(huì)詳細(xì)講解二叉樹(shù)遍歷的四種方式,分別為前序遍歷、中序遍歷、后續(xù)遍歷和層序遍歷。在學(xué)習(xí)遍歷之前,會(huì)先帶大家回顧一下二叉樹(shù)的基本概念
    2022-05-05
  • C/C++中*和&的用法詳解

    C/C++中*和&的用法詳解

    在本篇文章中我們給大家總結(jié)了C/C++中*和&的用法以及相關(guān)的代碼分享,有興趣的朋友趕緊學(xué)習(xí)下吧。
    2018-03-03

最新評(píng)論