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

C++線程中幾類鎖的詳解

 更新時間:2021年11月19日 09:06:58   作者:ufgnix0802  
這篇文章主要為大家介紹了C++線程中幾類鎖,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

C++線程中的幾類鎖

多線程中的鎖主要有五類:互斥鎖條件鎖、自旋鎖讀寫鎖、遞歸鎖。一般而言,所得功能與性能成反比。而且我們一般不使用遞歸鎖(C++提供std::recursive_mutex),這里不做介紹。

互斥鎖

==互斥鎖用于控制多個線程對它們之間共享資源互斥訪問的一個信號量。==也就是說為了避免多個線程在某一時刻同時操作一個共享資源,例如一個全局變量,任何一個線程都要使用初始鎖互斥地訪問,以避免多個線程同時訪問發(fā)生錯亂。

在某一時刻只有一個線程可以獲得互斥鎖,在釋放互斥鎖之前其它線程都不能獲得互斥鎖,以阻塞的狀態(tài)在一個等待隊列中等待。

頭文件:#include

類型:std::std::mutex、std::lock_guard

用法:在C++中,通過構(gòu)造std::mutex的實例創(chuàng)建互斥單元,調(diào)用成員函數(shù)lock()來鎖定共享資源,調(diào)用unlock()來解鎖。不過一般不使用這種解決方案,更多的是使用C++標準庫中的std::lock_guard類模板,實現(xiàn)了一個互斥量包裝程序,提供了一種方便的RAII風(fēng)格的機制在作用域塊中。

關(guān)于RAII慣用法的介紹:。。。

示例代碼:

#include <iostream>
#include <thread>//C++11線程庫是跨平臺的
#include <mutex>//C++互斥鎖
#include <vector>
#include <windows.h>
int g_num = 0;
std::mutex g_mutex;
void ThreadFunc(int a)
{
	cout << "啟動線程:" << a << endl;
	for (int i = 0; i < 1000000; i++)
	{
		//g_mutex.lock();
		std::lock_guard<std::mutex> m(g_mutex);//互斥量包裝程序
		g_num++;
		//g_mutex.unlock();
	}
}

int main()
{
	for (int i = 0; i < 4; i++)
	{
		std::thread t(ThreadFunc, i);
		t.detach();
	}
	Sleep(2000);
	cout << "g_num:" << g_num << endl;
	return 0;
}

//高階版,將上述main()函數(shù)的函數(shù)名更改,再更改以下的mainTest()即可執(zhí)行。兩個方法的執(zhí)行的結(jié)果相同,原理也相同。
int mainTest()
{
	std::vector<std::thread *> ts;
	for (int i = 0; i < 4; i++)
	{
		std::thread *t = new std::thread(ThreadFunc, i);
		//t.detach();
		ts.push_back(t);
	}
	for (auto begin = ts.begin(); begin != ts.end(); begin++)
		(*begin)->join();
	Sleep(2000);
	cout << "g_num:" << g_num << endl;
	return 0;
}

效果圖

TIPS:注意std::cout和std::end都是線程不安全的,所以才會出現(xiàn)線程1和線程3在一行,原因就是線程1未執(zhí)行cout<<endl。CPU的時間片就已經(jīng)用完了,CPU轉(zhuǎn)移執(zhí)行線程3后,再執(zhí)行線程1的cout<<endl。

具體C++11中thread庫join和detach的區(qū)別可參考:http://www.dbjr.com.cn/article/229636.htm

條件鎖

條件鎖就是所謂的條件變量,當某一個線程因為某個條件未滿足時可以使用條件變量使該程序處于阻塞狀態(tài),一旦條件滿足則以“信號量”的方式喚醒一個因為該條件而被阻塞的線程。最為常見的就是再線程池中,初始情況下因為沒有任務(wù)使得任務(wù)隊列為空,此時線程池中的線程因為“任務(wù)隊列為空”這個條件處于阻塞狀態(tài)。一旦有任務(wù)進來,就會以信號量的方式喚醒該線程來處理這個任務(wù)。

自旋鎖

互斥鎖和條件鎖都是比較常見的鎖,比較容易理解。接下來用互斥鎖和自旋鎖的原理相互比較,來理解自旋鎖。

假設(shè)我們有一臺計算機,該計算機擁有兩個處理器core1和core2.現(xiàn)在在這臺計算機上運行兩個線程:T1和T2,且T1和T2分別在處理器core1和core2上面運行,兩個線程之間共享一份公共資源Public。

首先我們說明互斥鎖的工作原理,互斥鎖是一種sleep-waiting的鎖。假設(shè)線程T1訪問公共資源Public并獲得互斥鎖,同時在core1處理器上運行,此時線程T2也想要訪問這份公共資源Public(即想要獲得互斥鎖),但是由于T1正在使用Public使得T2被阻塞。當T2處于阻塞狀態(tài)時,T2被放入等待隊列中,處理器core2會去處理其它的任務(wù)而不必一直等待(忙等)。也就是說處理器不會因為線程被阻塞而空閑,它會去處理其它事務(wù)。

然后我們說明自旋鎖的工作原理,自旋鎖是一種busy-waiting的鎖。也就是說,如果T1正在使用Public,而T2也想使用Public,此時T2肯定是得不到這個自旋鎖的。與互斥鎖相反,此時運行T2的處理器core2會一直不斷地循環(huán)檢查Public使用可用(自旋鎖請求),直到獲得到這個自旋鎖為止。

從“自旋鎖”的名稱也可以看出,如果一個線程想要獲得一個被使用的自旋鎖,那么它會一直占用CPU請求這個自旋鎖使得CPU不能去做其它的事情,知道獲取這個鎖為止,這就是“自旋”的含義。當發(fā)生阻塞時,互斥鎖可以讓CPU去處理其它的事務(wù),但自旋鎖讓CPU一直不斷循環(huán)請求獲取這個鎖。通過比較,我們可以明顯的得出結(jié)論:“自旋鎖”是比較消耗CPU的。

讀寫鎖

讀寫鎖我們可以借助于“讀者-寫者”問題進行理解。接下來我們簡單說下“讀者-寫者”問題。

計算機中某些數(shù)據(jù)被多個進程共享,對數(shù)據(jù)庫的操作有兩種:一種是讀操作,就是從數(shù)據(jù)庫中讀取數(shù)據(jù)不會修改數(shù)據(jù)庫中內(nèi)容;另一種就是寫操作,寫操作會修改數(shù)據(jù)庫中存放的數(shù)據(jù)。因此可以得到我們允許在數(shù)據(jù)庫上同時執(zhí)行多個“讀”操作,但是某一時刻只能在數(shù)據(jù)庫上有一個“寫”操作來更新數(shù)據(jù)。這就是簡單的讀者-寫者模型。

參考博客

http://www.dbjr.com.cn/article/214502.htm

總結(jié)

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • C++中的偽隨機數(shù)

    C++中的偽隨機數(shù)

    這篇文章主要介紹了C++中的偽隨機數(shù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • C++開發(fā)截屏小程序功能

    C++開發(fā)截屏小程序功能

    這篇文章主要介紹了C++開發(fā)截屏小程序功能,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-04-04
  • C語言全部內(nèi)存操作函數(shù)的實現(xiàn)詳細講解

    C語言全部內(nèi)存操作函數(shù)的實現(xiàn)詳細講解

    這篇文章主要介紹了C語言全部內(nèi)存操作函數(shù)的實現(xiàn)詳細講解,作者用圖文代碼實例講解的很清晰,有感興趣的同學(xué)可以研究下
    2021-02-02
  • 求子數(shù)組最大和的解決方法詳解

    求子數(shù)組最大和的解決方法詳解

    本篇文章是對求子數(shù)組最大和的解決方法進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • C++如何有效地利用命名空間

    C++如何有效地利用命名空間

    談到C++編程中的模塊化和組織性時,命名空間(Namespace)是一個重要的概念,所以本文主要來和大家聊聊C++命名空間的概念、用法以及如何有效地利用它來管理代碼,有需要的可以參考下
    2023-09-09
  • C語言實現(xiàn)打飛機游戲

    C語言實現(xiàn)打飛機游戲

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)打飛機游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • C++的原生數(shù)組你了解多少

    C++的原生數(shù)組你了解多少

    這篇文章主要為大家詳細介紹了C++的原生數(shù)組,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • 使用C語言訪問51單片機中存儲器的核心代碼

    使用C語言訪問51單片機中存儲器的核心代碼

    這篇文章主要介紹了使用C語言訪問51單片機中存儲器的相關(guān)知識,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-01-01
  • C++如何用智能指針管理內(nèi)存資源

    C++如何用智能指針管理內(nèi)存資源

    這篇文章主要介紹了C++如何用智能指針管理內(nèi)存資源,幫助大家更好的理解和使用c++開發(fā),感興趣的朋友可以了解下
    2020-08-08
  • C語言實現(xiàn)游戲VIP停車場管理系統(tǒng)

    C語言實現(xiàn)游戲VIP停車場管理系統(tǒng)

    這篇文章主要介紹了C語言實現(xiàn)游戲VIP停車場管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-12-12

最新評論