holyya.com
2025-09-04 13:05:59 Thursday
登录
文章检索 我的文章 写文章
C++中线程安全的vector实现
2023-07-04 21:37:51 深夜i     --     --
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库。

  
  

评论区

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