c++ - 保留 vector 是线程安全的吗?

标签 c++ stl thread-safety

我知道,一般来说,C++ STL 不能保证读写的线程安全。

如果 vector 不会调整大小,并且读写区域不会重叠怎么办?

下面的代码有问题吗? (保证数据永远不会超过v的保留长度)

class Foo {
public:
    Foo(){
        v.reserve(99999);
        startWriter();
        startReader();
    }
    void startWriter() {
        std::thread t([&](){
            while (true) {
               if (auto message = bar.recieve(); !message.is_empty()) { 
                   v.push_back(message.value());
               }
            }
        });
        t.detach();
    }
    void startReader() {
        std::thread t([&](){
            int last_idx = 0;
            while (true) {
                int new_idx = v.size();
                for (int i = last_idx; i < new_idx; ++i) {
                    v2.push_back(v[i]);
                }
                last_idx = new_idx;
                sleep(3);
            }
        });
        t.detach();
    }
private:
    vector<int> v;
    vector<int> v2;
    Bar bar;
}

或者我需要v = vector<int>(99999);并使用v[actual_size++] = message.value();相反?

或者这两种方法都不是线程安全的?

感谢您的回答。

最佳答案

当谈到线程时,你并没有真正绕过它。如果代码不明确,显然是线程安全的,那么就将其视为不安全。

说到标准库,就很清楚了。 push_back 是一个修改函数。该调用与从其他线程作用于该对象的任何其他调用之间必须存在适当的同步;否则,会发生数据争用。

再多的储备也不会改变这一点。

关于c++ - 保留 vector 是线程安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76116473/

相关文章:

c++ - 通过 C 强制转换访问结构的第一个字段是否违反了严格的别名?

c++ - 使用线程构建 block (TBB) 时如何修改线程调度行为?

C++ 从指针生成函数

c++ - 如何将 hash_map 与 char* 一起使用并进行字符串比较?

c++ - 在 OpenCV 2.x (C++) 中设置屏幕原点

c++ - STL push_back 优化导致数组下标超出数组边界

c# - 查询队列和线程安全

c - 多个线程一起打印值

java - 如果我从我的同步方法调用非同步方法是非同步方法线程安全的吗?

c++ - 我的 C++ 代码不适用于图形