使用带有boost conditional_variable

时间:2015-09-04 10:06:20

标签: c++ multithreading boost buffer

我尝试使用前后缓冲区和两个线程来编写录像机,这段代码可以工作,但是很难调试多线程代码,所以我不确定这段代码是否能100%正常工作我真的很感激,如果有人能看到这个并检查我是否遗漏了任何东西。

基本理念是, 编码线程正在等待前缓冲区 在这个时间记录线程正在填充缓冲区,当它完成时,它会切换缓冲区。 编码线程编码前缓冲区,记录缓冲区再次填充后台缓冲区。

boost::mutex frontbuflock_;
boost::condition_variable ready_cond_;
raw_buffer_t raw_buf[2];
raw_buffer_t* raw_back_buffer_ = 0;
raw_buffer_t* raw_front_buffer_ = 0;
boost::atomic_bool front_buffer_ready_;

void record_thread()
{
    do
    {
        int32_t* p = &raw_back_buffer_->at(0);

        [[[ fill backbuffer with image data here ]]]

        frontbuflock_.lock();

        //swap buffers
        raw_buffer_t* tmp = raw_front_buffer_;
        raw_front_buffer_ = raw_back_buffer_;
        raw_back_buffer_ = tmp;

        front_buffer_ready_ = 1;

        ready_cond_.notify_one();
        frontbuflock_.unlock();

    }while(!stop_);
}

void encode_thread()
{
    do
    {
        while(!front_buffer_ready_)
            ready_cond_.wait(lock);

        frontbuflock_.lock();

        [[[ encode frontbuffer here ]]]

        front_buffer_ready_ = 0;
        frontbuflock_.unlock();
    }while(!stop_);
}
我找到了一个小东西,让我们说记录线程通知条件变量并释放frontbuflock,编码线程应该锁定前缓冲但记录线程在编码线程之前会再次填充backbuffer并锁定前缓冲区的可能性很小。在这种情况下,我会失去一个框架,我不确定我是否应该打扰这个。

1 个答案:

答案 0 :(得分:0)

我建议你使用自己喜欢的测试框架为它编写一些单元测试,然后在helgrind中运行测试。它是检测同步错误的工具,它是valgrind的一部分:http://valgrind.org/docs/manual/hg-manual.html

根据我对valgrind工具的个人经验,我最初将灵敏度设置为最小值,因为这些工具通常会报告很多错误。其中一些不是你的错,而是你正在使用的库。你想先得到低悬的果实。一旦你修复或压制了重大错误,就转移到不太严重的错误。冲洗&重复。

快乐的调试! :)