作为对线程的完整介绍,我做了一些探索,以寻找线程安全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_;
};
第一个问题,这是vector的线程安全实现吗?第二个问题是如果是,那么为什么push_back
并insert
要求将呼叫lock_guard
和cond_.notify
同时operator[]
,begin()
并end()
没有?谢谢
不,这不是线程安全的。
线程1可以进入:
ContainedType &operator[](int index)
{
return vec_[index];
}
并刚刚计算了引用ContainedType &
并将其写入返回值。然后线程2进入:
void push_back(ContainedType in) {
向量也无效,因此引用也无效。繁荣。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句