【问题标题】:Are std::vectors threadsafe? [duplicate]std::vectors 是线程安全的吗? [复制]
【发布时间】:2012-06-21 18:17:12
【问题描述】:

可能重复:
Is stl vector concurrent read thread-safe?

我有一个多线程程序,它有一定数量的工人,每个工人都有一个'workerID',它本质上只是那个线程的唯一整数。我想使用结构向量来管理这些线程。我的问题是,如果线程 4 想要访问 myVector[4],而线程 8 想要访问 myVector[8],我会有问题吗?

【问题讨论】:

    标签: c++ multithreading vector


    【解决方案1】:

    如果你在进入多线程场景之前已经设置好了vector,然后你只想从多个线程中读取vector,不修改它,那么它是线程安全的。您甚至可以同时从两个以上的线程读取相同的元素,只要确保没有线程以任何方式修改向量。将向量及其所有元素视为只读。

    但是,对于修改,标准库中的所有容器都不是线程安全的。您需要自己实现同步。

    C++11已经引入了很多synchronization primitives,所以如果你的编译器支持,你可以使用它们。

    【讨论】:

    • 删除了我的反对票。我不打算投票,因为这是一个重复,所以将 OP 定向到有很多参考资料的other question 更具建设性。
    • @JonathanWakely:我已经投票结束,但我不会删除我的答案,因为它没有害处。
    • 还有一个问题,如果另一个线程为向量锁定互斥体以更改其中的值,那么其他仅读取其给定位置的线程是否需要担心任何事情?
    • @Whyrusleeping:如果一个线程写入,那么它应该被所有其他线程锁定,即使是读取。即当一个线程修改时,不允许其他线程写入/修改和读取/检查。
    • 谢谢,这就是我需要知道的一切!
    【解决方案2】:

    没有。跨线程管理向量类并不安全,您需要使用一些同步机制(例如互斥锁)来保护对std::vector<> 实例的读/写访问。

    【讨论】:

    • 正如 Thomas 上面提到的问题所说,如果数据是预先设置好的,并且所有线程都在进行 only 读取,那么它是安全的。如果一个线程正在写入并且没有其他线程正在读取该元素,则它可能是安全的,但我不确定标准对它的保证程度(由于存储在同一个单词中的元素之间的读取-修改-写入问题) .
    • @JonathanWakely:这对于 cx11 标准来说是正确的,不是吗? OP没有明确提到这一点。但无论如何,很高兴知道...
    • 没有提到,但我在回复@bdow,C++03 标准没有说 anything 关于线程,所以 C++11 标准是唯一相关的
    【解决方案3】:

    除非他们使用相同的元素,否则您不会有问题 (afaik)。

    但如果他们删除某些东西,或 push_back 某些东西等,那就是个坏主意。

    为了安全起见,请使用锁。

    【讨论】:

    • 谢谢,我一直在考虑使用锁,我唯一的保留(因为我是多线程新手)是对使用锁的性能影响。
    【解决方案4】:

    一般来说 std::vector 不是线程安全的。但你想做的是安全的。如果您只在多个线程中读取向量,这将起作用。如果每个线程只写入自己的偏移量,它也可以工作。如果您开始在线程中调整向量的大小,或者多个线程想要写入相同的偏移量,则绝对行不通。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-23
      • 2017-12-23
      相关资源
      最近更新 更多