2012-10-15 272 views
4

我有一个数据结构有两种访问它的方法:query()和modify()。多个线程可以同时使用query(),但只有一个线程可以输入modify(),同时所有使用query()的线程必须在modify()上进行访问之前退出。多个读取和单个写入 - 线程安全?

什么是使C++这个数据结构线程安全的最佳方式?

(我读了升压读/写锁,但有人告诉我,这可能是比使用互斥3-40x慢)

+0

首先尝试最简单的办法 - 保护所有与互斥访问。 99.5%的时间,这将是令人满意的,你的工作将完成。 (如果一个线程不可能尝试修改该对象,而另一个线程正在或可能正在访问它,则不需要锁定。假设您的读取不会以任何方式修改该对象。) –

+0

It取决于'modify'中发生了什么。读和写部分的全部保护措施是在更改中途停止读取无效。只保护'修改'功能不会实现这一点。但是,如果您只保护单个数据类型,例如int或指针,我相信这样可以。不过,我想写一个非常残酷的测试程序来验证。的 – paddy

+0

可能重复[我需要保护在多线程环境下读取访问一个STL容器?](http://stackoverflow.com/questions/187583/do-i-need-to-protect-read-access-to -an-STL-容器中-A-多线程-ENVIRON) –

回答

1

一般来说,你应该保护共享数据使用互斥。

但如果你键入共享数据是整数,你还可以考虑使用std::atomic,这通常比锁定一个互斥体快得多。