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;
    }
    
    
  • 相关阅读:
    人生中第一份值得纪念的工作
    ZOJ 3829 Known Notation(字符串处理 数学 牡丹江现场赛)
    java基础之内部类
    从计算的本质到编程语言
    【Cocos2dx】资源目录,播放背景音乐,导入外部库
    POJ 3723 Tree(树链剖分)
    hdu 1002 A + B Problem II(大正整数相加)
    时间格式字符串转化为date和时间戳
    深入浅出游戏算法(4)-unity3d算法(1)-球转动
    GeoServer手动发布本地Shapefile地图
  • 原文地址:https://www.cnblogs.com/sasasatori/p/12164396.html
Copyright © 2011-2022 走看看