【发布时间】:2010-09-16 07:11:21
【问题描述】:
我有一个 std::list 容器和这些线程:
一个无限添加元素的编写器线程。
一个读取器/写入器线程,在可用时读取和删除元素。
多个读取器线程访问容器的 SIZE(通过使用 size() 方法)
有一个普通的互斥锁可以保护前两个线程对列表的访问。我的问题是,大小读取器线程是否也需要获取此互斥锁?我应该使用读/写互斥锁吗?
我在使用 Visual C++ 6 的 Windows 环境中。
更新:看起来答案还不清楚。总结主要疑问:考虑到我不需要确切的值(即我可以假设一个+/- 1 个变化)?竞争条件如何使我的 size() 调用返回无效值(即与好的值完全无关的值)?
答案:通常,必须保护读取器线程以避免出现竞争条件。尽管如此,在我看来,更新中提到的一些问题还没有得到解答。
提前致谢!
谢谢大家的回答!
【问题讨论】:
-
不看代码就无法回答。读者线程如何遍历列表。读者是否有可能对突然删除的节点有一个迭代器?如果是这样,尝试移动到下一个或上一个迭代器现在变得未定义。
-
好吧,SIZE 读取器线程(正在讨论的线程)不会遍历列表,只需调用 size() 方法。其他线程(写入器和读取器/写入器)均受互斥锁保护。
-
必看讲座在这里:channel9.msdn.com/posts/…
-
鉴于写入器和读取器/写入器线程可以更改大小,读取器线程需要与它们同步。这对于防止读取器线程被调整容器大小的线程抢占是必要的。 “访问单个变量”不是原子的。
标签: c++ multithreading visual-c++ stl concurrency