Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.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++ 我是否需要在push_back pop_front场景中使用互斥锁锁定STL列表?_C++_Multithreading_Stl - Fatal编程技术网

C++ 我是否需要在push_back pop_front场景中使用互斥锁锁定STL列表?

C++ 我是否需要在push_back pop_front场景中使用互斥锁锁定STL列表?,c++,multithreading,stl,C++,Multithreading,Stl,我有一个线程推回到STL列表,另一个线程从列表中弹出。在这种情况下,是否需要使用互斥锁锁定列表?可能。这些操作不够简单,不能是原子操作,因此只有在实现显式执行必要的锁定时,它们才是线程安全的 但是,C++标准没有指定这些操作是否应该是线程安全的,因此取决于单个实现。检查文档。(或者让我们知道您使用的是哪种实现)不能保证STL实现是线程安全的,因为它会降低性能,我想大多数都不是。您肯定应该使用互斥体。因为stl pop/push操作是非原子的,所以您必须使用互斥体 来自: 如果多个线程访问单个容器

我有一个线程推回到STL列表,另一个线程从列表中弹出。在这种情况下,是否需要使用互斥锁锁定列表?

可能。这些操作不够简单,不能是原子操作,因此只有在实现显式执行必要的锁定时,它们才是线程安全的


但是,C++标准没有指定这些操作是否应该是线程安全的,因此取决于单个实现。检查文档。(或者让我们知道您使用的是哪种实现)

不能保证STL实现是线程安全的,因为它会降低性能,我想大多数都不是。您肯定应该使用互斥体。

因为stl pop/push操作是非原子的,所以您必须使用互斥体

来自:

如果多个线程访问单个容器,并且至少一个线程可能会写入,那么用户负责确保容器访问期间线程之间的互斥


由于您的两个线程都修改了列表,我想您必须锁定它。

大多数STL实现在sens中是线程安全的,您可以从多个线程访问列表类型的多个实例,而无需锁定。但在访问列表的同一实例时必须锁定


查看更多信息:

SGI的STL与在C++标准库中实现的STL不一样。后者不涉及并发或线程。(还有许多其他差异,尽管这些差异在这里并不相关)。但简而言之,你不能假设SGI所说的将适用于stdlib