wbczyh 2020-01-07
最近一段时间在做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; }