0

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

我应该用互斥锁保护列表吗?

谢谢。

4

3 回答 3

6

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

您可以考虑使用 pthread_rwlock,使用读取锁进行读取,使用写入锁进行写入。rwlocks 的好处是您可以同时拥有多个读取器,从而减少锁定争用。或者至少是一个 pthread_mutex。(当然,假设是 Linux)

于 2012-09-12T14:29:00.737 回答
1

好的,这是一个链表,对吧?所以想象你从A->C->D 你开始删除C。它说“好的,我们需要重定向Anextptr。但在此之前,你开始插入B。这会在没有被中断的情况下完成,你最终会得到A->B->C->D。然后删除继续,改变A而不是B。你最终得到A->Dand nothing->B->who knows?。所以锁定。

于 2012-09-12T14:33:41.657 回答
0

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

于 2012-09-12T14:31:48.420 回答