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 倍。
| 归档时间: |
|
| 查看次数: |
2883 次 |
| 最近记录: |