最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++11中條件標(biāo)量和互斥鎖應(yīng)用出現(xiàn)死鎖問題

 更新時間:2023年06月06日 15:00:47   作者:hsy12342611  
這篇文章主要介紹了C++11中條件標(biāo)量和互斥鎖應(yīng)用出現(xiàn)死鎖思考,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

條件變量和互斥鎖在多線程同步過程中經(jīng)常被使用,以下測試程序測試其使用。

1.測試程序1

#include <mutex>
#include <deque>
#include <iostream>
#include <thread>
#include <condition_variable>
class MCTest {
public:
	MCTest() : m_work(true), m_max_num(30), m_next_index(0) {
	}
	void producer_thread() {
		while (m_work) {
			std::this_thread::sleep_for(std::chrono::milliseconds(500));
			std::unique_lock<std::mutex> lk(m_cvMutex);
			m_cv.wait(lk);
			m_data.push_back(m_next_index++);
			std::cout << "producer " << m_next_index << ", queue size: " << m_data.size() << std::endl;
			m_cv.notify_all();
		}
	}
	void consumer_thread() {
		while (m_work) {
            std::unique_lock<std::mutex> lk(m_cvMutex);
            m_cv.wait(lk);
		    int data = m_data.front();
		    m_data.pop_front();
		    std::cout << "consumer " << data << ", deque size: " << m_data.size() << std::endl;
		    m_cv.notify_all();
		}
	}
private:
	bool m_work;
	std::mutex m_cvMutex;
	std::condition_variable m_cv;
	std::deque<int> m_data;
	size_t m_max_num;
	int m_next_index;
};
int main() {
	MCTest obj;
	std::thread tp = std::thread(&MCTest::producer_thread, &obj);
	std::thread tc = std::thread(&MCTest::consumer_thread, &obj);
    tp.join();
    tc.join();
	return 0;
}

運行結(jié)果:

2.測試程序2 

#include <mutex>
#include <deque>
#include <iostream>
#include <thread>
#include <condition_variable>
class MCTest {
public:
	MCTest() : m_work(true), m_max_num(30), m_next_index(0) {
	}
	void producer_thread() {
		while (m_work) {
			std::this_thread::sleep_for(std::chrono::milliseconds(500));
			std::unique_lock<std::mutex> lk(m_cvMutex);
			m_cv.wait(lk, [this]() -> bool { return this->m_data.size() < this->m_max_num; });
			m_data.push_back(m_next_index++);
			std::cout << "producer " << m_next_index << ", queue size: " << m_data.size() << std::endl;
			m_cv.notify_all();
		}
	}
	void consumer_thread() {
		while (m_work) {
            std::unique_lock<std::mutex> lk(m_cvMutex);
            m_cv.wait(lk, [this] { return !this->m_data.empty(); });
		    int data = m_data.front();
		    m_data.pop_front();
		    std::cout << "consumer " << data << ", deque size: " << m_data.size() << std::endl;
		    m_cv.notify_all();
		}
	}
private:
	bool m_work;
	std::mutex m_cvMutex;
	std::condition_variable m_cv;
	std::deque<int> m_data;
	size_t m_max_num;
	int m_next_index;
};
int main() {
	MCTest obj;
	std::thread tp = std::thread(&MCTest::producer_thread, &obj);
	std::thread tc = std::thread(&MCTest::consumer_thread, &obj);
    tp.join();
    tc.join();
	return 0;
}

運行結(jié)果:

 3.運行結(jié)果思考

為什么測試1程序沒有任何輸出,出現(xiàn)死鎖,而程序2正常交替執(zhí)行?

程序1條件變量在得到通知之前會一直wait,如果線程1獲取了鎖后,阻塞于wait調(diào)用,釋放了互斥鎖,等待通知。此時線程2執(zhí)行,線程2獲取鎖后,阻塞于阻塞于wait調(diào)用,并釋放互斥鎖,等待喚醒。本質(zhì)上是處于死鎖狀態(tài)。

程序2條件變量處于wait阻塞時,除了得到通知會解除阻塞外,第二個參數(shù)為true時,wait函數(shù)也會返回,所以避免了死鎖的存在。

總結(jié)一下,wait函數(shù)參數(shù)2含義如下:

(1)如果參數(shù)為true,即使沒有收到通知,wait也會返回,此時本線程互斥量已經(jīng)加鎖
(2)如果參數(shù)為false,在沒有收到通知時,解鎖互斥量wait一直阻塞
(3)如果沒有參數(shù),與false一樣

到此這篇關(guān)于C++11中條件標(biāo)量和互斥鎖應(yīng)用出現(xiàn)死鎖思考的文章就介紹到這了,更多相關(guān)C++11條件標(biāo)量和互斥鎖內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言實現(xiàn)從指定位置截取文件內(nèi)容

    C語言實現(xiàn)從指定位置截取文件內(nèi)容

    這篇文章主要為大家詳細(xì)介紹了如何利用C語言實現(xiàn)從指定位置截取文件內(nèi)容,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-11-11
  • C++14 新特性之函數(shù)返回值類型推導(dǎo)

    C++14 新特性之函數(shù)返回值類型推導(dǎo)

    本文主要介紹了C++14 新特性之函數(shù)返回值類型推導(dǎo),在模板編程和一些返回類型復(fù)雜或不易直接指明的情況下非常有用,下面就來具體介紹一下,感興趣的可以了解一下
    2024-05-05
  • C++ 類的友元機(jī)制解讀

    C++ 類的友元機(jī)制解讀

    這篇文章主要介紹了C++ 類的友元機(jī)制的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用c++,感興趣的朋友可以了解下
    2021-02-02
  • C++實現(xiàn)萬年歷源代碼

    C++實現(xiàn)萬年歷源代碼

    這篇文章主要介紹了C++實現(xiàn)萬年歷源代碼,可以直接在VC6.0編譯運行,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • C++快速排序及優(yōu)化方案詳解

    C++快速排序及優(yōu)化方案詳解

    這篇文章主要介紹了C++快速排序及優(yōu)化方案詳解,快速排序是一種常用的排序算法,它通過選擇一個基準(zhǔn)元素,將數(shù)組分成兩個子數(shù)組,其中一個子數(shù)組的所有元素都小于基準(zhǔn)元素,另一個子數(shù)組的所有元素都大于基準(zhǔn)元素,需要的朋友可以參考下
    2023-10-10
  • 解析C/C++中如何終止線程的運行

    解析C/C++中如何終止線程的運行

    本篇文章是對C/C++中如何終止線程運行的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C++實現(xiàn)LeetCode(91.解碼方法)

    C++實現(xiàn)LeetCode(91.解碼方法)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(91.解碼方法),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C++實現(xiàn)乒乓球比分判定

    C++實現(xiàn)乒乓球比分判定

    這篇文章主要為大家詳細(xì)介紹了C++實現(xiàn)乒乓球比分判定,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • 簡單了解C語言中主線程退出對子線程的影響

    簡單了解C語言中主線程退出對子線程的影響

    這篇文章主要介紹了簡單了解C語言中主線程退出對子線程的影響,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-12-12
  • C語言實現(xiàn)打飛機(jī)游戲

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

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)打飛機(jī)游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03

最新評論

北安市| 同心县| 莆田市| 扶沟县| 伊宁市| 漳浦县| 赤水市| 莱芜市| 榕江县| 永清县| 望城县| 肥乡县| 大安市| 普兰店市| 依安县| 衡东县| 宕昌县| 安康市| 无为县| 涡阳县| 德江县| 鸡东县| 安龙县| 盱眙县| 柳江县| 五原县| 弥渡县| 宁晋县| 北京市| 运城市| 武汉市| 江门市| 探索| 新野县| 古丈县| 赞皇县| 汉寿县| 崇州市| 华宁县| 满城县| 佳木斯市|