// 通用库
namespace Common
{
namespace Thread
{
// 线程安全通用缓冲区队列
template <typename Type>
class CThreadBuffer
{
public:
CThreadBuffer()
{
pthread_mutex_init(&m_lock, NULL);
pthread_cond_init(&m_notEmpty, NULL);
pthread_cond_init(&m_notFull, NULL);
m_iReadPos = 0;
m_iWritePos = 0;
}
~CThreadBuffer()
{
pthread_mutex_destroy(&m_lock);
pthread_cond_destroy(&m_notEmpty);
pthread_cond_destroy(&m_notFull);
}
public:
// 入队
void Push(const Type& data)
{
pthread_mutex_lock(&m_lock);
// 等待缓冲区未满
if ((m_iWritePos + 1) % BUFF_SIZE == m_iReadPos)
{
pthread_cond_wait(&m_notFull, &m_lock);
}
// 写数据,并移动指针
m_buffer[m_iWritePos] = data;
m_iWritePos++;
if (m_iWritePos >= BUFF_SIZE)
{
m_iWritePos = 0;
}
// 设置缓冲区非空的条件变量
pthread_cond_signal(&m_notEmpty);
pthread_mutex_unlock(&m_lock);
}
// 出队
void Pop(Type& data)
{
pthread_mutex_lock(&m_lock);
// 等待缓冲区非空
if (m_iWritePos == m_iReadPos)
{
pthread_cond_wait(&m_notEmpty, &m_lock);
}
// 读数据,移动读指针
data = m_buffer[m_iReadPos];
m_iReadPos++;
if (m_iReadPos >= BUFF_SIZE)
{
m_iReadPos = 0;
}
// 设置缓冲区未满的条件变量
pthread_cond_signal(&m_notFull);
pthread_mutex_unlock(&m_lock);
}
private:
static const int BUFF_SIZE = 32;
Type m_buffer[BUFF_SIZE];
int m_iReadPos;
int m_iWritePos;
pthread_mutex_t m_lock;
pthread_cond_t m_notEmpty;
pthread_cond_t m_notFull;
};
}
}
线程安全通用缓冲区队列类
最新推荐文章于 2023-05-28 20:01:37 发布