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;
    }
    
    
  • 相关阅读:
    排序算法的实现
    图——广度优先遍历(邻接矩阵存储)
    最大子列和问题-4种解法
    PATB 1015. 德才论 (25)
    PATB 1018. 锤子剪刀布
    PATB 1019. 数字黑洞 (20)
    常用协议的默认端口号
    统一资源定位符URL
    hdoj1009 FatMouse' Trade——贪心算法
    hdoj2037 贪心算法——今年暑假不AC
  • 原文地址:https://www.cnblogs.com/sasasatori/p/12164396.html
Copyright © 2011-2022 走看看