繁体   English   中英

C ++中单个对象的线程安全容器

[英]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_containeratomic_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM