21xrx.com
2024-12-22 22:34:53 Sunday
登录
文章检索 我的文章 写文章
C++线程安全Deque实现
2023-07-02 04:33:02 深夜i     --     --
C++ 线程安全 Deque 实现 多线程

C++线程安全Deque (Double Ended Queue)是在多线程环境下使用的容器,可以在队列头和队列尾进行插入和删除操作。C++ STL中也有提供Deque容器,但是这个容器在多线程环境下是不安全的。因此,我们需要自己实现一个线程安全的Deque。

主要思路:

1.对Deque容器中的插入和删除操作进行加锁,保证多个线程在操作Deque时不会发生数据竞争的问题。

2.使用条件变量来解决polling问题,避免CPU的浪费。

下面是一个简版C++线程安全Deque的实现:

#include

#include

#include

template

class ThreadSafeDeque

{

public:

  ThreadSafeDeque() {}

  void push_front(const T& value)

  {

    std::unique_lock lock(m_mutex);

    m_deque.push_front(value);

    m_cond.notify_one();

  }

  void push_back(const T& value)

  {

    std::unique_lock lock(m_mutex);

    m_deque.push_back(value);

    m_cond.notify_one();

  }

  bool pop_front(T& value)

  {

    std::unique_lock lock(m_mutex);

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

    if (m_deque.empty())

      return false;

    value = std::move(m_deque.front());

    m_deque.pop_front();

    return true;

  }

  bool pop_back(T& value)

  {

    std::unique_lock lock(m_mutex);

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

    if (m_deque.empty())

      return false;

    value = std::move(m_deque.back());

    m_deque.pop_back();

    return true;

  }

  bool empty() const

  {

    std::lock_guard lock(m_mutex);

    return m_deque.empty();

  }

  std::size_t size() const

  {

    std::lock_guard lock(m_mutex);

    return m_deque.size();

  }

private:

  std::deque m_deque;

  mutable std::mutex m_mutex;

  std::condition_variable m_cond;

};

使用mutex和condition_variable来实现线程安全Deque相对简单,推荐大家多多研究源代码来掌握线程安全的容器使用技巧。

  
  

评论区

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