快速且无锁的单写入器、多读取器

Det*_*nar 1 c++ multithreading lock-free

我有一个编写者必须以相当高的频率增加变量,还有一个或多个读者以较低的频率访问该变量。

写入由外部中断触发。

由于我需要高速写入,因此我不想使用互斥体或其他昂贵的锁定机制。

我想出的方法是在写入后复制该值。读者现在可以将原件与副本进行比较。如果它们相等,则变量的内容有效。

这是我在 C++ 中的实现

template<typename T>
class SafeValue
{
private:
    volatile T _value;
    volatile T _valueCheck;
public:
    void setValue(T newValue)
    {
        _value = newValue;
        _valueCheck = _value;
    }

    T getValue()
    {
        volatile T value;
        volatile T valueCheck;
        do
        {
            valueCheck = _valueCheck;
            value = _value;
        } while(value != valueCheck);

        return value;
    }
}
Run Code Online (Sandbox Code Playgroud)

其背后的想法是在读取时检测数据争用,并在发生时重试。但是,我不知道这是否永远有效。我在网上没有找到任何关于这种方法的信息,因此我的问题是:

当我的方法与单个作者和多个读者一起使用时有什么问题吗?

我已经知道高写作频率可能会导致读者饥饿。还有其他我需要警惕的不良影响吗?难道这根本就不是线程安全的吗?

编辑1:

我的目标系统是 ARM Cortex-A15。

T应该能够成为至少任何原始整型。

编辑2:

std::atomic读者和作家网站上的速度太慢。我在我的系统上对其进行了基准测试。与未受保护的原始操作相比,写入速度大约慢 30 倍,读取速度大约慢 50 倍。

sel*_*bie 5

这个单个变量只是整数、指针还是普通的旧值类型,您可能可以只使用std::atomic

  • @Detonar 你的说法毫无意义。研究 `std::atomic` 生成的程序集。 (2认同)