最近一段時間在做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;
}