2014-03-18 68 views
5

这似乎是一个令人难以置信的简单的问题,但在我所有的研究,我一直没能找到一个很好的例子......C++线程安全的对象

我试图建立一个自定义类使用getter和setter函数可访问私有变量。这个类将在全局范围(extern)中实例化一次,并将在我的应用程序中充当数据缓存。它将被许多线程同时使用,99%用于读取,并且速度非常重要。有什么办法允许并发读取并锁定写入? (我假设没有)

我是否简单地包含一个作用域互斥体作为getter和setter的第一行?或者如何设计这个看似简单的对象的最佳方式?任何例子或链接将不胜感激(我很难包围我的头)。

我确实有Boost编译进来,所以它是可用的。

我真的很感激它!

+2

这不过是一件简单的事。每一个细节都很重要。不幸的是,你的描述只有那些珍贵的东西。 –

+0

您可以使用['std :: mutex'](http://en.cppreference.com/w/cpp/thread/mutex)或类似的同步机制来保护访问类成员,但也许可以使用'const' getter方法,异步锁变量需要声明为“可变”。 –

回答

8

假设你的封装是正确的,getter和setter上的锁应该是足够的。

为了提供并发读取,请查看Readers-Writer锁,它可以提供您所需的同步级别。我认为boost::shared_mutex符合法案。

由于这是一个缓存,所以如果您能够容忍过时的值,那么就性能而言,您可能需要调查RCU或Read-copy-update。用户空间RCU至少有one library

+0

shared_mutex正是我正在寻找的 - 谢谢!我结束了一个非常类似于以下的解决方案:http://stackoverflow.com/a/6450576/455215 – Harry