【发布时间】:2012-10-15 09:07:41
【问题描述】:
我有一个数据结构,它有两种访问方法:query() 和 modify()。多个线程可以同时使用 query(),但只有一个线程可以进入 modify(),同时所有使用 query() 的线程都必须退出,然后才能在 modify() 上进行访问。
在 C++ 中使这种数据结构线程安全的最佳方法是什么?
(我阅读了 boost 读/写锁定,但有人告诉我它可能比使用互斥锁慢 3-40 倍)
【问题讨论】:
-
首先尝试最简单的解决方案——使用互斥锁保护所有访问。 99.5% 的时间,这将是令人满意的,你的工作就会完成。 (如果一个线程不可能尝试修改对象,而另一个线程正在或可能正在访问它,则不需要锁定。这假设您的读取不会以任何方式修改对象。)跨度>
-
这取决于
modify中发生的情况。读取和写入部分保护的全部意义在于阻止读取在更改中途时无效。仅保护modify函数将无法实现这一点。但是,如果您只保护单个数据类型,例如int或指针,我相信这可以。但是,我想编写一个极其残酷的测试程序来验证这一点。 -
fwiw,对于快速进出锁,互斥锁(至少在 win32/64 上)将比暴击秒慢得多。如果您要跨越流程边界,那么您别无选择,但如果您的单流程考虑它是一种选择。我敢肯定 Linux 人员解决了这个问题,至少比windoze 做得更好。
标签: c++ multithreading thread-safety