21xrx.com
2024-12-22 20:40:00 Sunday
登录
文章检索 我的文章 写文章
C++队列线程安全实现
2023-07-11 08:32:23 深夜i     --     --
C++ 队列 线程安全 实现

C++队列是常用的数据结构之一,在多线程编程中也经常会被使用。但是,由于多线程的特性,队列的操作可能会出现线程安全问题,例如竞态条件、内存泄漏等。因此,在使用C++队列时,我们需要注意线程安全问题,并实现正确的线程安全机制。

实现线程安全队列的常用方法是使用互斥锁和条件变量。互斥锁可以确保同一时间只有一个线程可以访问队列,从而避免竞态条件的问题。条件变量用于通知等待中的线程有新的元素可供取用,从而避免空闲线程的浪费。下面是一个基于互斥锁和条件变量的线程安全队列的实现:


#include <queue>

#include <mutex>

#include <condition_variable>

template<typename T>

class ThreadSafeQueue {

public:

  ThreadSafeQueue() {}

  void push(T value) {

    std::unique_lock<std::mutex> lock(m_mutex);

    m_queue.push(value);

    m_cond.notify_one();

  }

  bool tryPop(T& value) {

    std::lock_guard<std::mutex> lock(m_mutex);

    if (m_queue.empty())

      return false;

    

    value = m_queue.front();

    m_queue.pop();

    return true;

  }

  void waitAndPop(T& value) {

    std::unique_lock<std::mutex> lock(m_mutex);

    m_cond.wait(lock, [this](){ return !m_queue.empty(); });

    value = m_queue.front();

    m_queue.pop();

  }

  bool empty() const {

    std::lock_guard<std::mutex> lock(m_mutex);

    return m_queue.empty();

  }

private:

  std::queue<T> m_queue;

  mutable std::mutex m_mutex;

  std::condition_variable m_cond;

};

该线程安全队列使用了三个成员变量:一个std::queue用于存储元素,一个std::mutex用于保护队列,一个std::condition_variable用于在队列不为空时通知等待线程。push()函数实现元素的插入操作,并通过notify_one()通知等待中的线程。tryPop()函数实现元素的取出操作,如果队列为空则返回false。waitAndPop()函数则在队列为空时进入等待状态,并通过lambda表达式判断队列是否已经有元素。empty()函数则用于查询队列是否为空。

在使用该线程安全队列时,我们可以直接使用push()、tryPop()、waitAndPop()、empty()这四个函数进行操作,而不需要再关注线程安全问题。

总而言之,线程安全队列是一个非常常用的数据结构,在多线程编程中经常会被使用。借助互斥锁和条件变量,实现线程安全队列是比较容易的,而且代码中的操作和普通队列相似,使用起来也比较方便。

  
  
下一篇: C++学习路线图

评论区

{{item['qq_nickname']}}
()
回复
回复