[英]Thread safe container for single object in c++
是否有一个c ++容器(单个编写器,多个读取器)用于存储始终可读写的单个值(无锁)? 阅读时,获取过时的版本就可以了。
我想到了这样的事情:
template <class T>
class Container {
bool active = 0;
T object[2];
public:
void writeData(T t)
{
object[!active] = t;
active = !active;
}
T readData()
{
return object[active];
}
};
我想到的一个问题:
Read thread reads active = 0
Write thread happens (active = 1)
another Write thread starts and writes to 0
Read thread reads the data which is currently written to
主动的原因不是原子的,但由于它是布尔型的,并且一次仅发生一个写线程,因此两个可能的值都是可以接受的。
这不是一个完整的解决方案,而是如何实现的一个想法:
假设您要存储的值是非原始类型(否则只使用atomic
,请参见http://en.cppreference.com/w/cpp/atomic/atomic ),那么您可以使用的是atomic<Container*> current_container;
作为指向您对象的中心指针。 而在你的writer
每次更新准备新的完全形成Container
对象以更新的数据,并在其完成设置current_container
指向一个新的对象。
请注意,此方法有一些警告:
在writer中,替换后您不能立即删除Container
的旧实例,因为某些读者可能仍在使用它。 如果您的容器是动态分配的,那么这可能会很棘手。 您可能希望将std::shared_ptr
用于current_container
和atomic_exchage
作为更改其值的方法(请参阅http://en.cppreference.com/w/cpp/memory/shared_ptr/atomic )
这种方法将要求编写者为每次更新完全准备一个新版本的Container
如果Container
很大且其复制成本很高,则这可能会很昂贵
我不知道一个现成的实现。 但是我们正在努力将这种功能纳入C ++标准: http : //www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0561r3.html
该论文表明,对于完全线程安全和某种形式的回收,您要解决一个相当复杂的问题。 无论如何,本文中的规范应有助于创建正确的实现。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.