21xrx.com
2025-04-11 07:54:37 Friday
文章检索 我的文章 写文章
C++中线程安全的vector实现
2023-07-04 21:37:51 深夜i     35     0
C++ 线程安全 vector 实现

在C++中,vector是一种常用的容器类,能够动态地存储元素。然而,在多线程环境下使用vector会经常出现线程竞争的问题,因此需要实现线程安全的vector。

线程安全的vector实现需要考虑以下几个方面:

1. 多个线程同时访问vector的时候,需要进行互斥锁保护,避免并发访问造成数据不一致的问题。

2. 在扩容和插入元素的时候,需要考虑线程安全性,避免多个线程同时修改vector的大小和内容,造成遗漏、重复或者出错等问题。

下面是一份线程安全的vector实现的代码:

template <typename T>
class ThreadSafeVector
{
public:
  ThreadSafeVector() {}
  ~ThreadSafeVector() {}
  // 插入元素
  void push_back(const T& t)
  {
    std::lock_guard<std::mutex> lock(m_mutex);
    m_vec.push_back(t);
  }
  // 获取元素个数
  size_t size()
  {
    std::lock_guard<std::mutex> lock(m_mutex);
    return m_vec.size();
  }
  // 根据索引获取元素
  T& at(size_t i)
  {
    std::lock_guard<std::mutex> lock(m_mutex);
    return m_vec.at(i);
  }
private:
  std::vector<T> m_vec;
  std::mutex m_mutex; // 互斥锁
};

这份实现中使用了std::mutex来对vector进行互斥保护,保障多个线程同时操作vector的正确性。在插入元素、获取元素个数和根据索引获取元素的操作中,都用lock_guard确保了m_mutex的加锁和解锁。

实现中需要注意的是,在每次获取vector的大小之前都需要使用互斥锁进行加锁,因为vector的大小可能在多个线程之间进行修改,获取大小的操作必须是原子的;同时,在根据索引获取元素的时候,也需要使用at函数,避免越界访问。

最后需要注意的是,这份线程安全的vector实现是基于互斥锁的,因此在高并发访问的时候可能有较大的性能开销,因此,当需要高效率的访问时,可以考虑使用基于读写锁(std::shared_mutex)的实现,或者使用现有的线程安全的vector库。

  
  

评论区

请求出错了