我有两个线程,一个插入一对("键/值")到列表中,另一个从同一个列表中删除一对。 现在我可以保证那些线程永远不会修改相同的"键/值"对。
如果我用互斥锁保护列表,该线程是否安全?
感谢。
答案 0 :(得分:6)
通常,对任何std容器的任何修改都应该完全受到保护。
您可以考虑使用pthread_rwlock,使用读锁定进行读取,使用写锁定进行写入。关于rwlocks的好处是你可以拥有多个同时读者,从而减少锁定争用。或者至少是pthread_mutex。 (当然假设是Linux)
答案 1 :(得分:1)
好的,这是一个链表,对吗?
所以想象一下你从A->C->D
开始
您开始删除C
。它说“好的,我们需要重定向A
的{{1}} ptr。
但在此之前,您开始插入next
。这样做不会中断,最终会得到B
。然后移除继续,更改A->B->C->D
而不是A
。最终得到B
和A->D
。
所以锁定。
答案 2 :(得分:0)
听起来像mutex是必需的......列表管理与插入和擦除功能一起使用,你不希望发生碰撞。如果您知道列表管理的确切实现细节,您可以编写一些专业代码,以便不需要互斥锁,但这是您最简单/最安全的路由。从性能角度来看,您可能只想锁定列表访问区域...即在一个线程中操作 - >锁定>插入 - >解锁,并锁定> remove-> unlock->在另一个线程中运作。