亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C++11中條件標量和互斥鎖應用出現死鎖問題

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

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

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;
}

運行結果:

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;
}

運行結果:

 3.運行結果思考

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

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

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

總結一下,wait函數參數2含義如下:

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

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

相關文章

最新評論