国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

C++11并發(fā)與多線程筆記(6) unique_lock(類模板)

這篇具有很好參考價(jià)值的文章主要介紹了C++11并發(fā)與多線程筆記(6) unique_lock(類模板)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

1、unique_lock取代lock_guard

unique_lock 是一個(gè)類模板。
unique_lock 比 lock_guard 靈活很多多出來很多用法),效率差一點(diǎn),內(nèi)存占用多一些。
使用:
unique_lock<mutex> myUniLock(myMutex);

2、unique_lock的第二個(gè)參數(shù)

2.1 std::adopt_lock:

std::adopt_lock:標(biāo)記作用,表示這個(gè)互斥量已經(jīng)被lock()(方便記憶:已經(jīng)被lock()收養(yǎng)了,不需要再次lock() ),即不需要在構(gòu)造函數(shù)中l(wèi)ock這個(gè)互斥量了。
前提必須提前l(fā)ock,否則會(huì)出錯(cuò)
lock_guard中也可以用這個(gè)參數(shù)

2.2 std::try_to_lock:

  • 嘗試用mutex的lock()去鎖定這個(gè)mutex,但如果沒有鎖定成功,會(huì)立即返回,不會(huì)阻塞在那里;
  • 使用try_to_lock的原因是防止其他的線程鎖定mutex太長時(shí)間,導(dǎo)致本線程一直阻塞在lock 這個(gè)地方
    前提不能提前l(fā)ock();
    owns_lock()方法判斷是否拿到鎖,如拿到返回true
    實(shí)例:
    假設(shè)
    線程1 執(zhí)行下例代碼時(shí),先鎖定互斥量myMutex1
    ,然后暫停了2s,才繼續(xù)執(zhí)行程序。線程1執(zhí)行的代碼如下
bool outMsgProc(int &num)
{
	unique_lock<mutex> muGuard(myMutex1);
	chrono::milliseconds time(2000);    //線程暫停2s
	this_thread::sleep_for(time);
	if (!myList.empty())
	{
		num = myList.front();
		myList.pop_front();
		return true;
	}
	return false;
}

在此期間,如果線程2也嘗試鎖定myMutex1,就只能阻塞,直到線程1釋放鎖后,才能繼續(xù)執(zhí)行。線程2執(zhí)行的代碼如下:

void InMsg()
{
	for (int i = 0; i < 10000; i++)
	{
		cout << "插入元素: " << i << endl;
		unique_lock<mutex> muGuard(myMutex1);
		myList.push_back(i);			
	}
}

顯然,這樣的程序效率不高。線程2花費(fèi)了太多的時(shí)間等待。

我們考慮使用try_to_lock,線程嘗試獲取鎖,如果沒有鎖定成功,它不會(huì)阻塞在那里,可以去執(zhí)行其他代碼。改進(jìn)后的代碼如下:

void InMsg()
{
	for (int i = 0; i < 10000; i++)
	{
		cout << "插入元素: " << i << endl;
		unique_lock<mutex> muGuard(myMutex1, try_to_lock);
		if (muGuard.owns_lock())// 判斷是否拿到鎖
		{
			myList.push_back(i);
		}
		else
		{
			//沒有拿到鎖時(shí),執(zhí)行的代碼
		}
	}
}

2.3 std::defer_lock:

  • 如果沒有第二個(gè)參數(shù)就對(duì)mutex進(jìn)行加鎖,加上defer_lock是始化了一個(gè)沒有加鎖的mutex
  • 不給它加鎖的目的是以后可以調(diào)用unique_lock的一些方法
  • 前提不能提前l(fā)ock

3、unique_lock的成員函數(shù)(前三個(gè)與std::defer_lock聯(lián)合使用)

3.1 lock():加鎖。

unique_lock<mutex> muGuard(myMutex, defer_lock);
muGuard.lock();//手動(dòng)加鎖

不用自己unlock();

3.2 unlock():解鎖。

unique_lock<mutex> muGuard(myMutex, defer_lock);
muGuard.lock();
//處理一些共享代碼
muGuard.unlock();
//臨時(shí)處理一些非共享代碼
muGuard.lock();
//處理一些共享代碼,處理完之后,自動(dòng)解鎖

3.3 try_lock():嘗試給互斥量加鎖

try_to_lock是unique_lock的第二個(gè)參數(shù),try_lock()是unique_lock()的成員變量。
如果拿不到鎖,返回false,否則返回true(然后上鎖)。

 unique_lock<mutex>muGuard(myMutex, defer_lock);
 //mutex1.lock();//自動(dòng)解鎖
 if (muGuard.try_lock() == true) {
     cout << "插入數(shù)據(jù): " << num << endl;
     test_list.push_back(num);
 }
 else {
     cout << "in_list()執(zhí)行,但沒有拿到鎖" << num << endl;
 }

3.4 release():

release():就是解除綁定,返回它所管理的mutex對(duì)象的指針,并釋放所有權(quán)。

  1. unique_lock<mutex>muGuard(myMutex1);
    相當(dāng)于把myMutex(mutex對(duì)象)和 muGuard綁定在了一起
  2. mutex* ptx =muGuard.release();
    也就是說 muGuard和mutex不在有聯(lián)系,后續(xù)myMutex所有權(quán)由ptx接管,如果原來mutex對(duì)象處理加鎖狀態(tài),就需要ptx在以后進(jìn)行解鎖了。
for (int num = 0; num < 10000; num++) {
    unique_lock<mutex> muGuard(myMutex);
    mutex* ptx = muGuard.release();//解除myMutex1(mutex對(duì)象)和 muGuard綁定
    //操作事務(wù)
    test_list.push_back(num);
    ptx->unlock();//myMutex1所有權(quán)由ptx接管,由ptx進(jìn)行解鎖
}

lock的代碼段越少,執(zhí)行越快,整個(gè)程序的運(yùn)行效率越高。

  • 鎖住的代碼少,叫做粒度細(xì),執(zhí)行效率;
  • 鎖住的代碼多,叫做粒度粗,執(zhí)行效率
    -只鎖定共享的數(shù)據(jù)

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

unique_lock<mutex> muGuard1(myMutex);
把myMutex1和muGuard綁定在了一起,也就是muGuard擁有myMutex1的所有權(quán)

4.1 使用move轉(zhuǎn)移

unique_lock<mutex> muGuard2(std::move(muGuard1));
之前muGuard1擁有myMutex的所有權(quán),muGuard1可以把自己對(duì)myMutex的所有權(quán)轉(zhuǎn)移,但是不能復(fù)制。現(xiàn)在muGuard2擁有myMutex的所有權(quán)。文章來源地址http://www.zghlxwxcb.cn/news/detail-655872.html

4.2. 在函數(shù)中return一個(gè)臨時(shí)變量,也可以實(shí)現(xiàn)轉(zhuǎn)移

unique_lock<mutex> aFunction()
{
    unique_lock<mutex> tmpguard(myMutex);
    //移動(dòng)構(gòu)造函數(shù)那里講從函數(shù)返回一個(gè)局部的unique_lock對(duì)象是可以的
    //返回這種局部對(duì)象會(huì)導(dǎo)致系統(tǒng)生成臨時(shí)的unique_lock對(duì)象,并調(diào)用unique_lock的移動(dòng)構(gòu)造函數(shù)
    return tmpguard;
}
// 然后就可以在外層調(diào)用,在muGuard2具有對(duì)myMutex的所有權(quán)
std::unique_lock<std::mutex> muGuard2 = aFunction();

到了這里,關(guān)于C++11并發(fā)與多線程筆記(6) unique_lock(類模板)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • C++11并發(fā)與多線程筆記(10) future其他成員函數(shù)、shared_future、atomic

    C++11并發(fā)與多線程筆記(10) future其他成員函數(shù)、shared_future、atomic

    status = result.wait_for(std::chrono::seconds(幾秒)); 卡住當(dāng)前流程,等待std::async()的異步任務(wù)運(yùn) 行一段時(shí)間,然后返回其狀態(tài)std::future_status 。如果std::async()的參數(shù)是std::launch::deferred(延遲執(zhí)行),則不會(huì)卡住主流程。 std::future_status是枚舉類型,表示異步任務(wù)的執(zhí)行狀態(tài)。類型的取值

    2024年02月12日
    瀏覽(45)
  • C++11并發(fā)與多線程筆記(7) 單例設(shè)計(jì)模式共享數(shù)據(jù)分析、解決,call_once

    程序靈活,維護(hù)起來可能方便,用設(shè)計(jì)模式理念寫出來的代碼很晦澀,但是別人接管、閱讀代碼都會(huì)很痛苦 老外應(yīng)付特別大的項(xiàng)目時(shí),把項(xiàng)目的開發(fā)經(jīng)驗(yàn)、模塊劃分經(jīng)驗(yàn),總結(jié)整理成設(shè)計(jì)模式 中國零幾年設(shè)計(jì)模式剛開始火時(shí),總喜歡拿一個(gè)設(shè)計(jì)模式往上套,導(dǎo)致一個(gè)小小的

    2024年02月12日
    瀏覽(23)
  • C++并發(fā)與多線程筆記八:async、future、packaged_task、promise

    本文接上文 C++并發(fā)與多線程筆記七:condition_variable、wait、notify_one/all 的內(nèi)容,主要記錄 async、future、packaged_task、promise 概念以及用法。 2.1 基本用法 std::async 是個(gè)函數(shù)模板,用來啟動(dòng)一個(gè)異步任務(wù),啟動(dòng)一個(gè)異步任務(wù)后,它返回一個(gè) std::future 類模板對(duì)象。 上述\\\"啟動(dòng)一個(gè)異步

    2023年04月13日
    瀏覽(22)
  • 分布式集群與多線程高并發(fā)

    ? 后臺(tái)數(shù)據(jù)的處理語言有很多,Java 是對(duì)前端采集的數(shù)據(jù)的一種比較常見的開發(fā)語言?;ヂ?lián)網(wǎng)移動(dòng)客戶端的用戶量特別大,大量的數(shù)據(jù)處理需求應(yīng)運(yùn)而生。可移動(dòng)嵌入式設(shè)備的表現(xiàn)形式?? 很多,如 PC 端,手機(jī)移動(dòng)端,智能手表,Google? 眼鏡等。Server2client 的互聯(lián)網(wǎng)開發(fā)模式比

    2024年02月08日
    瀏覽(23)
  • Python中的并發(fā)編程:多線程與多進(jìn)程的比較【第124篇—多線程與多進(jìn)程的比較】

    Python中的并發(fā)編程:多線程與多進(jìn)程的比較【第124篇—多線程與多進(jìn)程的比較】

    在Python編程領(lǐng)域中,處理并發(fā)任務(wù)是提高程序性能的關(guān)鍵之一。本文將探討Python中兩種常見的并發(fā)編程方式:多線程和多進(jìn)程,并比較它們的優(yōu)劣之處。通過代碼實(shí)例和詳細(xì)的解析,我們將深入了解這兩種方法的適用場景和潛在問題。 多線程是一種輕量級(jí)的并發(fā)處理方式,適

    2024年03月14日
    瀏覽(20)
  • 【linux 多線程并發(fā)】多線程模型下的信號(hào)通信處理,與多進(jìn)程處理的比較,屬于相同進(jìn)程的線程信號(hào)分發(fā)機(jī)制

    ? 專欄內(nèi)容 : 參天引擎內(nèi)核架構(gòu) 本專欄一起來聊聊參天引擎內(nèi)核架構(gòu),以及如何實(shí)現(xiàn)多機(jī)的數(shù)據(jù)庫節(jié)點(diǎn)的多讀多寫,與傳統(tǒng)主備,MPP的區(qū)別,技術(shù)難點(diǎn)的分析,數(shù)據(jù)元數(shù)據(jù)同步,多主節(jié)點(diǎn)的情況下對(duì)故障容災(zāi)的支持。 手寫數(shù)據(jù)庫toadb 本專欄主要介紹如何從零開發(fā),開發(fā)的

    2024年01月17日
    瀏覽(21)
  • 【Java基礎(chǔ)教程】(四十二)多線程篇 · 上:多進(jìn)程與多線程、并發(fā)與并行的關(guān)系,多線程的實(shí)現(xiàn)方式、線程流轉(zhuǎn)狀態(tài)、常用操作方法解析~

    【Java基礎(chǔ)教程】(四十二)多線程篇 · 上:多進(jìn)程與多線程、并發(fā)與并行的關(guān)系,多線程的實(shí)現(xiàn)方式、線程流轉(zhuǎn)狀態(tài)、常用操作方法解析~

    理解進(jìn)程與線程的區(qū)別; 掌握J(rèn)ava 中多線程的兩種實(shí)現(xiàn)方式及區(qū)別; 掌握線程的基本操作方法; 進(jìn)程是程序的一次動(dòng)態(tài)執(zhí)行過程,它經(jīng)歷了從代碼加載、執(zhí)行到執(zhí)行完畢的一個(gè)完整過程,這個(gè)過程也是進(jìn)程本身從產(chǎn)生、發(fā)展到最終消亡的過程 。多進(jìn)程操作系統(tǒng)能同時(shí)運(yùn)行多

    2024年02月16日
    瀏覽(30)
  • JUC并發(fā)編程-線程和進(jìn)程、Synchronized 和 Lock、生產(chǎn)者和消費(fèi)者問題

    JUC并發(fā)編程-線程和進(jìn)程、Synchronized 和 Lock、生產(chǎn)者和消費(fèi)者問題

    源碼 + 官方文檔 面試高頻問! java.util 工具包、包、分類 業(yè)務(wù):普通的線程代碼 Thread Runnable Runnable 沒有返回值、效率相比入 Callable 相對(duì)較低! 線程、進(jìn)程,如果不能使用一句話說出來的技術(shù),不扎實(shí)! 進(jìn)程:一個(gè)程序,QQ.exe Music.exe 程序的集合; 一個(gè)進(jìn)程往往可以包含多

    2024年01月20日
    瀏覽(19)
  • JUC并發(fā)編程學(xué)習(xí)筆記(二)Lock鎖(重點(diǎn))

    JUC并發(fā)編程學(xué)習(xí)筆記(二)Lock鎖(重點(diǎn))

    傳統(tǒng)的synchronized 傳統(tǒng)的解決多線程并發(fā)導(dǎo)致的一些問題我們會(huì)使用synchronized來解決,synchronized的本質(zhì)就是隊(duì)列、鎖。 Lock的實(shí)現(xiàn)類有:可重復(fù)鎖(最常用)、讀鎖、寫鎖 在創(chuàng)建可重復(fù)鎖時(shí),可傳入boolean類型值來決定該鎖是公平鎖(先來后到)還是非公平鎖(可插隊(duì))

    2024年02月06日
    瀏覽(21)
  • JUC并發(fā)編程學(xué)習(xí)筆記(十)線程池(重點(diǎn))

    JUC并發(fā)編程學(xué)習(xí)筆記(十)線程池(重點(diǎn))

    線程池:三大方法、七大參數(shù)、四種拒絕策略 池化技術(shù) 程序的運(yùn)行,本質(zhì):占用系統(tǒng)的資源!優(yōu)化資源的使用!- 池化技術(shù)(線程池、連接池、對(duì)象池......);創(chuàng)建和銷毀十分消耗資源 池化技術(shù):事先準(zhǔn)備好一些資源,有人要用就拿,拿完用完還給我。 線程池的好處: 1、

    2024年02月06日
    瀏覽(30)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包