c++使用mutex进行进程同步

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;
}

相关推荐