【问题标题】:circular buffer using mutex使用互斥锁的循环缓冲区
【发布时间】:2013-08-21 05:49:00
【问题描述】:

这是来自我的教授希望我们挑战的 compsci 讲座测验。他说这门课是关于循环缓冲区的,但有很大的问题。我试图思考一整天,但没有任何线索。请给我一些想法

#include <stdint.h>
#include <boost/thread.hpp>

template <typename T, uint32_t max>
class CircularBuffer
{
public:

    CircularBuffer() : m_WriteOffset(0), m_ReadOffset(0){}
    ~CircularBuffer(){};

    void push( T val )
    {
        boost::lock_guard<boost::mutex> guard( m_Mutex );
        m_Buffer[m_WriteOffset++] = val;
    }

    T pull()
    {
        boost::lock_guard<boost::mutex> guard( m_Mutex );
        return m_Buffer[m_ReadOffset++];
    }

private:

    boost::mutex m_Mutex;

    enum { MAX_SIZE = max };
    T m_Buffer[MAX_SIZE];
    uint32_t m_WriteOffset;
    uint32_t m_ReadOffset;
};

【问题讨论】:

  • 给你一个提示:代码中有一个多余的分号。然后,用两个线程编写一个测试,一个用模式写入 N 个元素,另一个读取 N 个元素并验证模式。
  • 你应该包括&lt;cstdint&gt;而不是&lt;stdint.h&gt;
  • ...并使用 std::thread,但前提是您拥有 C++11 编译器。
  • 如果您不知道 mutexlock_guard 是什么,那么最好先研究一下。这是您问题级别的基本知识。

标签: c++ boost circular-buffer


【解决方案1】:

full, empty 方法未实现。 偏移增量必须像m_ReadOffset = (m_ReadOffset + 1) % MAX_SIZE,那么只有缓冲区是循环的。我的意思是读写偏移。

【讨论】:

  • 请问lock_guard在函数内部是如何工作的?我知道 mutex 是如何工作的,但不知道 boost 函数。
  • 抱歉,我无法回答您的问题。我其实不懂C++,只是回答了一个数据结构的逻辑部分。
【解决方案2】:

您要求提示,所以这里是一个:

如果在读取任何元素之前推送 MAX_SIZE+1 个元素会发生什么?

【讨论】:

  • 谢谢,不太了解 mutex 和 lock_guard 函数的工作原理,所以我有点搞不清楚主要问题是什么。
  • 锁守卫只是锁定互斥体,当它超出范围时解锁它。
猜你喜欢
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 2019-09-17
  • 2022-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-23
相关资源
最近更新 更多