c++使用mutex進行進程同步


最近一段時間在做SLAM有關的東西,研究源碼的時候碰到了一段和c++的進程同步有關的代碼,主要是有一個線程會獲取待處理的圖像&接收處理后的圖像(main),另一個線程(process)獲取圖像后進行處理然后輸出,圖片的輸入和輸出都是典型的生產者消費者問題,所以兩個線程用mutex進行同步。稍微花了一點功夫才縷清楚,所以這里專門自己寫了一個demo研究c++進程同步的問題。

其中c++的unique_lock是一個非常有趣的機制,當函數開始執行這個函數時,unique_lock自動對信號量加鎖,函數執行完畢后,unique_lock自動解鎖。

mutex信號量是操作系統里面的概念,用於處理臨界資源,在訪問臨界資源時未獲得信號量的進程會被阻塞。

#include <iostream>
#include <thread>
#include <mutex>

bool new_flag = false;
bool processed_flag = false;

std::mutex get_mutex;
std::mutex produce_mutex;

int i;

bool produce_new_object()
{
	std::unique_lock<std::mutex> lock(get_mutex);
	new_flag = true;
}

bool get_processed_object()
{
	std::unique_lock<std::mutex> lock(produce_mutex);
	if(processed_flag)
	{
		processed_flag = false;
		return true;
	}
	return false;
}

bool get_new_object()
{
	std::unique_lock<std::mutex> lock(get_mutex);
	if(new_flag)
	{
		new_flag = false;
		return true;
	}
	return false;
}

bool produce_processed_object()
{
	std::unique_lock<std::mutex> lock(produce_mutex);
	processed_flag = true;
}

void process()
{
	while(1)
	{
		while(!get_new_object());
		std::cout << "process the object " << i << std::endl;
		produce_processed_object();
	}
}

int main(int argc, char const *argv[])
{
	std::thread *t1;
	t1 = new std::thread(&process);

	for (i = 10; i > 0; i--)
	{
		produce_new_object();
		while(!get_processed_object());
	}
	return 0;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM