我有 2 个线程,一个将一对(“键/值”)插入一个列表,另一个从同一个列表中删除一对。现在我可以保证这些线程永远不会修改相同的“键/值”对。
我应该用互斥锁保护列表吗?
谢谢。
我有 2 个线程,一个将一对(“键/值”)插入一个列表,另一个从同一个列表中删除一对。现在我可以保证这些线程永远不会修改相同的“键/值”对。
我应该用互斥锁保护列表吗?
谢谢。
一般来说,对任何 std 容器的任何类型的修改都应该受到绝对保护。
您可以考虑使用 pthread_rwlock,使用读取锁进行读取,使用写入锁进行写入。rwlocks 的好处是您可以同时拥有多个读取器,从而减少锁定争用。或者至少是一个 pthread_mutex。(当然,假设是 Linux)
好的,这是一个链表,对吧?所以想象你从A->C->D
你开始删除C
。它说“好的,我们需要重定向A
的next
ptr。但在此之前,你开始插入B
。这会在没有被中断的情况下完成,你最终会得到A->B->C->D
。然后删除继续,改变A
而不是B
。你最终得到A->D
and nothing->B->who knows?
。所以锁定。
听起来像需要互斥锁......有列表管理与插入和擦除功能一起使用,您不希望发生冲突。如果您知道列表管理的确切实现细节,您也许可以编写一些特殊代码,这样就不需要互斥锁,但这是您最简单/最安全的路线。从性能的角度来看,您可能只想锁定列表访问区域...即在一个线程中操作->锁定->插入->解锁,在另一个线程中锁定->删除->解锁->操作。