Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;11 STL容器和螺纹安全_C++_Multithreading_Stl_C++11 - Fatal编程技术网

C++ C++;11 STL容器和螺纹安全

C++ C++;11 STL容器和螺纹安全,c++,multithreading,stl,c++11,C++,Multithreading,Stl,C++11,我很难找到这方面的最新信息 STL容器的C++11版本是否保证了一定程度的线程安全 由于性能原因,我确实希望他们不会这样做。但是,这也是为什么我们有和的原因。我认为STL容器提供了以下基本的线程安全保证: 同时读取同一对象是正常的 可以同时读取/写入不同的对象 但是,如果您想做一些不同的事情,例如在同一对象上同时写入数据,则必须使用某种形式的自定义同步(例如关键部分)。否。请查看PPL或Intel TBB以了解线程安全的STL类容器 和其他人一样,他们也注意到了通常的“多读取器线程安全”,但

我很难找到这方面的最新信息

STL容器的C++11版本是否保证了一定程度的线程安全


由于性能原因,我确实希望他们不会这样做。但是,这也是为什么我们有和的原因。

我认为STL容器提供了以下基本的线程安全保证:

  • 同时读取同一对象是正常的

  • 可以同时读取/写入不同的对象


但是,如果您想做一些不同的事情,例如在同一对象上同时写入数据,则必须使用某种形式的自定义同步(例如关键部分)。

否。请查看PPL或Intel TBB以了解线程安全的STL类容器


和其他人一样,他们也注意到了通常的“多读取器线程安全”,但这甚至是在C++11之前。Ofc这并不意味着一个作者多个读者。它意味着0个作者。:)

既然现有的答案没有涵盖(只有一条评论涉及),我只想提及当前版本的23.2.2[container.requirements.dataraces],其中说:

当同一序列中不同元素(除了
vector
)中包含的对象的内容被同时修改时,需要实现来避免数据争用

i、 e.访问同一容器的不同元素是安全的,因此,例如,您可以有一个包含十个元素的全局
std::vector
,并且有十个线程,每个线程都写入向量的不同元素


除此之外,与标准库的其余部分(见17.6.5.9[res.on.data.races])相同的规则适用于容器,如前所述,此外[container.requirements.dataraces]列出了容器的一些非常量成员函数,这些函数可以安全调用,因为它们只返回对元素的非常量引用,它们实际上不会修改任何东西(一般来说,任何非常量成员函数都必须被视为修改)。

我的猜测是,边界检查的性能级别与互斥体等完全不同。但是可能是错误的。容器访问级别的线程安全通常是无用的,因为您想要编写“cash[i]=cash[i]+total”之类的内容,并且锁定需要处于比容器本身更高的级别。一个相关的问题是有相当多的保证(部分[res.on.data.races],[container.requirements.dataraces]当然还有先决条件[intro.multithread])@C64先生的回答非常中肯,如果您想得到更具体的答案(可能带有标准引号),请调整问题。@avakar如果您能回答引号,那就太好了。我有标准,但最好能以详尽的答案结束这个问题。在这种情况下,“对象”的含义是什么?元素或容器?例如,可以在不同线程中“同时”执行
myvec[0]=0
myvec[1]
?如果“对象”是容器,那么这是对同一对象的读写,但是如果“对象”是元素,那么它不是。您还可以想象一个类似于散放树的容器,其中对该容器的同时读取是不正常的,但如果保证同时读取是正常的,那么就禁止将
std::map
实现为在这方面不安全的散放树。@Let_Me_be:“object”==container在这种情况下。@SteveJessop,
myvec[0]=0
同时
myvec[1]
正常--
连续容器上的运算符[]
必须避免争用([container.requirements.dataraces]/1)。对于无序和关联容器,这是不正确的。@ JONAANDAWEKLY,我基于N33 3/23.2.2/1:“为了避免数据竞争(17.5.9),实现应考虑以下函数:const:开始、结束、……,除了关联或无序的关联容器,运算符[]。”“但甚至是C++ 11”。不,不是。C++03甚至不知道线程是什么。因此,它没有指定处理线程的行为。他没有询问编译器如何实现该标准。他知道如何保证所提供的标准;因此,实现所提供的“保证”是不相关的。这就是你的观点,OP没有具体说明他只对标准感兴趣,而不是对现实感兴趣。但这是毫无意义的讨论,因为我答案的前两个字符是最重要的部分。其余的重要性主要体现在第二句中。:)@NoSensetal和事实上那些“最重要的部分”的“前两个字符”是错误的,因为其他答案已经清楚地表明,确实存在某种级别的线程安全保证,无论是仅用于不进行任何写入的同步读取,还是某些函数。因此,一个明确的“否”只是过于笼统,不能用任何方式来纠正。@ NoSeNeTeTe:“我不认为多个读者值得注意”,但他并没有问你认为值得注意的事情。他询问事实:“C++11版本的STL容器是否有一定程度的线程安全保证?”事实答案是“是”,因为该标准确实有一定程度的保证。