标签:图像 har ++ uniq cpp als The sse --
最近一段时间在做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;
}
标签:图像 har ++ uniq cpp als The sse --
原文地址:https://www.cnblogs.com/sasasatori/p/12164396.html