这是线程安全的向量吗?如果是,为什么为什么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_;
    };

第一个问题,这是vector的线程安全实现吗?第二个问题是如果是,那么为什么push_backinsert要求将呼叫lock_guardcond_.notify同时operator[]begin()end()没有?谢谢

杰弗里

不,这不是线程安全的。

线程1可以进入:

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

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

void push_back(ContainedType in) {

向量也无效,因此引用也无效。繁荣。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

Related 相关文章

热门标签

归档