Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.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++ 我是否需要保护对std::list(多线程)C++;_C++_Multithreading_List - Fatal编程技术网

C++ 我是否需要保护对std::list(多线程)C++;

C++ 我是否需要保护对std::list(多线程)C++;,c++,multithreading,list,C++,Multithreading,List,我有两个线程,一个在列表中插入一对(“键/值”),另一个从同一列表中删除一对。 现在我可以保证这些线程永远不会修改相同的“键/值”对 我应该用互斥锁保护列表的线程安全吗 谢谢。一般来说,对任何std容器的任何修改都应该受到绝对保护 可以考虑使用一个pthRead RWLOK,使用一个用于读取的读锁和一个用于写入的写锁。rwlocks的好处在于,您可以同时拥有多个读卡器,从而减少锁争用。或者至少是一个pthread_互斥体。(当然,假设是Linux)听起来需要互斥体。。。列表管理与插入和擦除功能一

我有两个线程,一个在列表中插入一对(“键/值”),另一个从同一列表中删除一对。 现在我可以保证这些线程永远不会修改相同的“键/值”对

我应该用互斥锁保护列表的线程安全吗


谢谢。

一般来说,对任何std容器的任何修改都应该受到绝对保护


可以考虑使用一个pthRead RWLOK,使用一个用于读取的读锁和一个用于写入的写锁。rwlocks的好处在于,您可以同时拥有多个读卡器,从而减少锁争用。或者至少是一个pthread_互斥体。(当然,假设是Linux)

听起来需要互斥体。。。列表管理与插入和擦除功能一起使用,您不希望发生冲突。如果您知道列表管理的具体实现细节,您可能可以编写一些特殊代码,这样就不需要互斥,但这是最简单/最安全的方法。从性能角度来看,您可能只想锁定列表访问区域。。。i、 e.在一个线程中操作->锁定->插入->解锁,在另一个线程中锁定->移除->解锁->操作。

好的,这是一个链表,对吗? 想象一下你从
A->C->D
您开始删除
C
。它说“好的,我们需要重定向
A
next
ptr。 但在此之前,你开始插入
B
。这样做不会被打断,最后你会得到
A->B->C->D
。然后删除继续进行,将
A
改为
B
。你会得到
A->D
什么都没有->B->谁知道?

所以锁定。

这完全取决于您的确切数据结构、操作的实现方式以及所需的锁定粒度。可能会重复,更不用说列表属性(如大小)。这也是一样,但在
c++11
之前,不要求该属性在固定时间内可用(即存储),因此每次都可以通过遍历列表来计算。当然,这只是意味着你不太可能注意到问题,而不是说你的情况更好。或者,如果你在没有锁定的情况下调用
size()
部分调用,则可能会有稍大的可能性。谁知道呢,不管怎样,这都是个坏主意。