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

50 C++ 多個線程共享資源問題fix方案二 ----- lock_guard類

這篇具有很好參考價值的文章主要介紹了50 C++ 多個線程共享資源問題fix方案二 ----- lock_guard類。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

前提:

在上一節(jié)中,我們使用了mutex的lock函數(shù)和unlock函數(shù)處理共享資源問題

這一節(jié),我們學習使用 lock_guard來處理 共享資源問題。

lock_guard是啥?

是個類模版,這個類模版只能對mutex類型進行構造

例子:

lock_guard<mutex> mylock_guard(mymutex);

50 C++ 多個線程共享資源問題fix方案二 ----- lock_guard類,c++

lock_guard的優(yōu)點:

優(yōu)點類似于智能指針,

當我們實例化一個 lock_guard后,不需要unlock()

lock_guard<mutex> mylock_guard(mymutex);

lock_guard工作原理

lock_guard是個類,那么就有構造函數(shù)和析構函數(shù)。

lock_guard的構造函數(shù)里面 執(zhí)行了 mutex::lock();

lock_guard的析構函數(shù)里面 指向了 mutex::unlock();

這也是lock_guard類只用 實例化出來,就不會unlock()的原因,因為當lock_guard 對象析構的時候,會自動的unlock();

這也意味著在實現(xiàn)時,要特別注意lock_guard 對象是什么時候析構的。必要的時候,可以用{}包裝起來。

lock_guard 實例

改動代碼如下:文章來源地址http://www.zghlxwxcb.cn/news/detail-799064.html

class Teacher166 {

public:
	//共享數(shù)據(jù) 存在list中
	list<int> msgListQueue;
	mutex mymutex;
	int readcount = 0;//記錄已經(jīng)讀取了多少個。
public:
	//讀取 共享數(shù)據(jù)的線程方法
	void readfunc() {
		while (true) {
			//只要不為空,就可以讀取數(shù)據(jù)
			if (readcount >= 2000) {
				break;
			}
			lock_guard<mutex> mylock_guard(mymutex);//mylock_guard在這里創(chuàng)建出來,在mylock_guard的構造函數(shù)中,就已經(jīng)對mymutex進行了lock()操作,等到mylock_guard的生命周期結(jié)束后會析構,這時候會調(diào)用mymutex的unlock()函數(shù)
			if (!msgListQueue.empty()) {
				int readvalue = msgListQueue.front();//每次都讀取第一個
				cout << "讀取到的值為" << readvalue << " readcount = " << readcount << endl;
				msgListQueue.pop_front();//刪除第一個元素
				readcount++;
			}
			else {
				cout << "沒有讀取到值" << endl;
			}
		}
	}

	//寫入 共享數(shù)據(jù)的線程方法
	void writefunc() {
		for (size_t i = 0; i < 1000; i++)
		{
			lock_guard<mutex> mylock_guard(mymutex);//mylock_guard在這里創(chuàng)建出來,在mylock_guard的構造函數(shù)中,就已經(jīng)對mymutex進行了lock()操作,等到mylock_guard的生命周期結(jié)束后會析構,這時候會調(diào)用mymutex的unlock()函數(shù),實際上這里實例化對象 lock_guard<mutex> 不管名字是啥,只要里面參數(shù)是 mymutex就可以了,也就是說:只要是同一個 mutex
			msgListQueue.push_back(i);//每次都寫到末尾
			cout << "寫入元素的值為" << i << endl;
		}
	}

public:
	Teacher166() {
		cout << "Teacher166 構造方法 this = " << this << endl;
	}

	Teacher166(const Teacher166 & obj) {
		cout << "Teacher166 copy 構造方法 this = " << this << "  obj = " << &obj << endl;
	}

	~Teacher166() {
		cout << "Teacher166 析構函數(shù) this = " << this << endl;
	}
};


void main() {

	cout << "=========================" << endl;

	Teacher166 tea1;

	thread readthread1(&Teacher166::readfunc, &tea1);
	thread writethread1(&Teacher166::writefunc, &tea1);
	//thread 的構造方法第二個參數(shù) 可以是地址,如果是地址,那么 readthread1 和 writethread1的傳遞就是同一個 teacher

	thread readthread2(&Teacher166::readfunc, &tea1);
	thread writethread2(&Teacher166::writefunc, &tea1);
	readthread1.join();
	readthread2.join();
	writethread1.join();
	writethread2.join();
}

到了這里,關于50 C++ 多個線程共享資源問題fix方案二 ----- lock_guard類的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

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

領支付寶紅包贊助服務器費用

相關文章

  • 一百四十九、Kettle——Linux上安裝的kettle8.2創(chuàng)建共享資源庫時遇到的問題(持續(xù)更新中)

    一百四十九、Kettle——Linux上安裝的kettle8.2創(chuàng)建共享資源庫時遇到的問題(持續(xù)更新中)

    在kettle8.2在Linux上安裝好可以啟動界面、并且可以連接MySQL、Hive、ClickHouse等數(shù)據(jù)庫后開始創(chuàng)建共享資源庫,但是遇到了一些問題 1、報錯詳情 2023/08/10 13:57:21 - Spoon - Caused by: java.lang.UnsatisfiedLinkError: Could not load SWT library. Reasons:? 2023/08/10 13:57:21 - Spoon - ?? ?no swt-mozilla-gtk-4335 i

    2024年02月13日
    瀏覽(18)
  • nodejs中的共享資源和鎖

    在Node.js中,如果你使用鎖來同步代碼,通常是為了防止多個線程或進程同時訪問共享資源,這可能導致數(shù)據(jù)不一致或其他問題。然而,Node.js本身并不是一個多線程環(huán)境,而是單線程的。因此,你通常不會在Node.js中使用鎖來同步線程,而是使用鎖來同步異步操作。 如果你正在

    2024年01月22日
    瀏覽(37)
  • 云計算資源供應模型是指云計算所提供的資源供應方式,主要包括共享型資源和專屬型資源。

    作者:禪與計算機程序設計藝術 云計算是一種將大數(shù)據(jù)、機器學習等技術應用到互聯(lián)網(wǎng)的數(shù)據(jù)中心中,向用戶提供更高級的計算服務的一種服務模式。其特點之一就是利用計算機硬件、網(wǎng)絡和軟件資源池作為計算基礎設施(Infrastructure as a Service, IaaS)或平臺服務(Platform as

    2024年02月06日
    瀏覽(21)
  • HTTP 第六章 跨資源共享(CORS)

    HTTP 第六章 跨資源共享(CORS)

    跨源資源共享(CORS,或通俗地譯為跨域資源共享)是一種基于 HTTP 頭的機制,該機制通過允許服務器標示除了它自己以外的其他源(域、協(xié)議或端口),使得瀏覽器允許這些源訪問加載自己的資源。跨源資源共享還通過一種機制來檢查服務器是否會允許要發(fā)送的真實請求,該

    2024年02月22日
    瀏覽(19)
  • 【開源】基于JAVA的教學資源共享平臺

    【開源】基于JAVA的教學資源共享平臺

    基于JAVA+Vue+SpringBoot+MySQL的教學資源共享平臺,包含了課程管理、課程課件、授課中心、作業(yè)發(fā)布、課程評價、課程質(zhì)量分析、交流互動模塊,還包含系統(tǒng)自帶的用戶管理、部門管理、角色管理、菜單管理、日志管理、數(shù)據(jù)字典管理、文件管理、圖表展示等基礎模塊,教學資源

    2024年01月19日
    瀏覽(27)
  • 【開源】基于JAVA語言的教學資源共享平臺

    【開源】基于JAVA語言的教學資源共享平臺

    基于JAVA+Vue+SpringBoot+MySQL的教學資源共享平臺,包含了課程管理、課程課件、授課中心、作業(yè)發(fā)布、課程評價、課程質(zhì)量分析、交流互動模塊,還包含系統(tǒng)自帶的用戶管理、部門管理、角色管理、菜單管理、日志管理、數(shù)據(jù)字典管理、文件管理、圖表展示等基礎模塊,教學資源

    2024年01月20日
    瀏覽(33)
  • D3D11和Vulkan共享資源 (一)

    D3D11和Vulkan共享資源 (一)

    很久以前研究過 用NV_DX_interop擴展讓D3D和OpenGL共享資源 , OpenGL在當初設計的時候電腦和操作系統(tǒng)還是個相對比較簡單的東西,因此OpenGL API設計沒有考慮到現(xiàn)在計算機架構的一些特性,比如多核編程和多顯卡并發(fā)。最近幾年出來個Vulkan來接OpenGL的班,所以繼續(xù)走起研究下D3D1

    2023年04月13日
    瀏覽(14)
  • CORS(跨域資源共享)源驗證失敗解決方法

    在web系統(tǒng)中,安全軟件掃描經(jīng)常會發(fā)現(xiàn)CORS(跨域資源共享)作為高危漏洞出現(xiàn)。本文提供用Nginx作為反向代理的解決方案。解決方式是在nginx.conf文件中做如下配置: 注意: 1、“xxxx.com\\\"是示例域名,按你實際用到的更改。如果有多個外部域名,則逐一按if方式處理。不建議用

    2024年02月15日
    瀏覽(21)
  • 【AI底層邏輯】——篇章7(下):計算資源&軟件代碼共享

    目錄 續(xù)上篇... 三、計算資源 1、第一階段:數(shù)據(jù)大集中 2、第二階段:資源云化

    2024年02月10日
    瀏覽(20)
  • 局域網(wǎng)訪問共享資源時提示不能訪問網(wǎng)絡位置的解決方法

    組建局域網(wǎng)之后,當然要實現(xiàn)局域網(wǎng)資源共享,但是有些時候,在局域網(wǎng)中訪問共享資源時,系統(tǒng)提示“不能訪問網(wǎng)絡位置,有關網(wǎng)絡排除故障的信息”,造成該問題的原因很多,請按本文所述的步驟一步一步檢查設置,即可解決問題,下面是具體方法,希望對您有所幫助; 不

    2024年02月06日
    瀏覽(19)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

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

二維碼1

領取紅包

二維碼2

領紅包