我是否需要保护对std :: list(多线程)C ++中不同键的访问

时间:2012-09-12 14:26:54

标签: c++ multithreading list

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

如果我用互斥锁保护列表,该线程是否安全?

感谢。

3 个答案:

答案 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。最终得到BA->D。 所以锁定。

答案 2 :(得分:0)

听起来像mutex是必需的......列表管理与插入和擦除功能一起使用,你不希望发生碰撞。如果您知道列表管理的确切实现细节,您可以编写一些专业代码,以便不需要互斥锁,但这是您最简单/最安全的路由。从性能角度来看,您可能只想锁定列表访问区域...即在一个线程中操作 - >锁定>插入 - >解锁,并锁定> remove-> unlock->在另一个线程中运作。