安全和默认并发? 为什么或者为什么不?

使动态数组成为线程安全和并发的意味着什么? 比如,说std::vector

  • 两个线程可能想要插入相同的位置。 不需要同步,因为它将按照线程调度完成。
  • 一个线程擦除,另一个去访问相同的元素? 这不是我认为的数据结构问题,它是一个使用问题。
  • 那么是否有任何需要通过std::vector完成的任务,以使它成为线程安全并发的,还是默认情况下是线程安全的和并发的?


    C ++ 11对标准库中容器的线程安全地说了以下内容:

    23.2.2容器数据竞赛[container.requirements.dataraces]

    为了避免数据争用(17.6.5.9)的目的,实施方式应考虑以下功能为常量: beginendrbeginrendfrontbackdatafindlower_boundupper_boundequal_rangeat和,除了在缔或者无序的关联容器operator[]

    尽管如(17.6.5.9)所述,当同一序列中不同元素中包含的对象的内容(除vector<bool> )被同时修改时,需要实现以避免数据争用。

    所以,基本上从多线程的容器中读取很好,并且修改已经在容器中的元素没问题(只要它们是不同的元素)。

    所以,你的两个更具体的问题都不是线程安全的std::vector

    1)插入到矢量中的两个线程正在修改矢量本身 - 不存在单独的元素。

    2)一个线程擦除和其他行为来访问相同的元素是不安全的,因为从向量擦除一个元素不是一个被承诺是线程安全的操作(或者像标准所说的那样“免于数据竞争”), 。

    要安全地执行这些操作将需要程序本身强加一些外部同步。


    对标准库中单个对象的唯一并发操作默认情况下是安全的 - 只访问const成员函数 - 对同步原语的所有访问(如互斥锁和解锁或原子操作)其他所有内容都必须在外部进行同步。 特别是,标准库还没有任何线程安全的容器(例如c ++ 14)

    所以你的两个例子的答案都是否定的,它们都需要一种外部同步的形式。

    你当然可以做的是修改容器中两个不同元素的值。

    链接地址: http://www.djcxy.com/p/13287.html

    上一篇: safe and concurrent by default? Why or why not?

    下一篇: Why is executing Java code in comments with certain Unicode characters allowed?