Jak*_*rka 3 c++ multithreading atomic
我有一个类型的共享变量double.这个变量将由两个线程访问.一个线程将只编写变量,而另一个线程将只读取变量.
我还能在这里得到比赛条件吗?如果是的话,C++中是否有一种"简单"的方式来实现原子访问?如果有更多的读取而不是写入,我如何有效地实现它?我需要将变量标记为volatile?
编辑:好的"阅读器"线程定期对批量数据工作,新值的传播不是时间敏感的.我没有实现我没有好的测试方法的复杂联锁,而是可以声明写入线程将写入的另一个临时变量.然后,当读者完成一个批处理时,它可以将临时值原子传播到实际变量.这会没有竞争条件吗?
是的,存在竞争条件,因为double变量在大多数处理器上不是原子的.
使用3个双打(可能是一个阵列之间有额外的填充,以避免错误共享,从而导致性能下降).
一个由读者拥有,一个由作者拥有,一个正在交付.
写入:写入写入时隙,然后原子地交换(例如InterlockedExchange)与写入时隙的指针/索引和切换时隙的索引.由于索引是指针大小或更小,只要变量正确对齐,原子交换就很容易.如果您的平台偶然提供带或不带内存屏障的互锁交换,请使用带有内存屏障的平台.
要读取:原子地将读取槽的指针/索引与切换变量的索引交换.然后读取读取插槽.
您实际上也应该包含版本号,因为读取的线程将倾向于在最新和上一个插槽之间反弹.阅读时,请在交换之前和之后阅读,然后使用更高版本的版本.
或者,在C++ 11中,只需使用std::atomic.
警告:以上内容仅适用于单个编写器/单个阅读器(此问题中的特定情况).如果您有多个,请考虑读取器 - 写入器锁或类似的保护对变量的所有访问.