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()
部分调用,则可能会有稍大的可能性。谁知道呢,不管怎样,这都是个坏主意。