zoukankan      html  css  js  c++  java
  • 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;
    }
    
    
  • 相关阅读:
    习题1
    实验3阅读下面程序、分析说明运行结果,并上机验证。
    实验2利用循环计算n个圆柱体体积。
    实验1编写求圆面积的程序,要求当输入的半径r<=0时,提示输入错误,要求r为浮点型,r的数值是动态的由键盘输入;
    例7-12
    例 7-11
    例7-9
    例7-8
    例7-7
    例7-6
  • 原文地址:https://www.cnblogs.com/sasasatori/p/12164396.html
Copyright © 2011-2022 走看看