这是一个线程安全的向量吗?如果是,为什么std::vector的一些方法需要锁定线程安全,而其他方法则不需要?<



作为一个完全的线程新手,我在寻找线程安全std::vector的实现方面做了一些研究。根据我的阅读,我得出了这个结论:

# include <vector>
template<class ContainedType>
class ThreadSafeVector {
public:
ThreadSafeVector()
: vec_(), mut_(), cond_() {}
explicit ThreadSafeVector(std::vector<ContainedType> vec)
: vec_(vec), mut_(), cond_() {};
ThreadSafeVector(std::initializer_list<ContainedType> vec)
: vec_(std::vector<ContainedType>(vec.begin(), vec.end())), mut_(), cond_() {};
~ThreadSafeVector() = default;
void insert(ContainedType in, int index) {
std::lock_guard<std::mutex> lock(mut_);
vec_[index] = std::move(in);
cond_.notify_one();
}
void push_back(ContainedType in) {
std::lock_guard<std::mutex> lock(mut_);
vec_.push_back(in);
cond_.notify_one();
}
ContainedType &operator[](int index) {
return vec_[index];
}
typename std::vector<ContainedType>::iterator begin() {
return vec_.begin();
}
typename std::vector<ContainedType>::iterator end() {
return vec_.end();
}
std::vector<ContainedType> toVector(){
return vec_;
}
private:
std::vector<ContainedType> vec_;
std::mutex mut_;
std::condition_variable cond_;
};

第一个问题,这是一个线程安全的实现向量?第二个问题,如果是,那么为什么push_backinsert需要调用lock_guardcond_.notify,而operator[],begin()end()不需要?由于

不,这不是线程安全的。

线程1可以进入:

ContainedType &operator[](int index) 
{
return vec_[index];
}

,并且刚刚计算了引用ContainedType &,并将其写入返回值。然后线程2进入:

void push_back(ContainedType in) {

并且向量失效,因此引用也失效。繁荣。

最新更新