【发布时间】:2012-04-29 07:39:18
【问题描述】:
我有一个double 类型的共享变量。这个变量将被两个线程访问。一个线程永远只会写入变量,而另一个线程永远只会读取变量。
我这里还有比赛条件吗?如果是,在 C++ 中是否有一种“简单”的方式来实现原子访问?如果读取比写入多得多,我如何有效地实现它?我需要将变量标记为volatile吗?
编辑:好的,“阅读器”线程定期处理批量数据,并且新值的传播不是时间敏感的。与其实现我没有好方法测试的复杂联锁,我可以只声明编写器线程将写入的另一个临时变量。然后,当阅读器完成一批时,它可以将临时值自动传播到实际变量。那会是无竞争条件的吗?
【问题讨论】:
-
@Jesse:许多编译器还没有该头文件的有效实现。
-
一个简单的互斥锁可以在这里工作,以确保您正在阅读良好的价值。当写入线程正在使用该变量时,互斥锁将阻止对该变量的访问,并且当它完成时将其解锁以供读取线程完成他的工作。在 unix 和 windows 上,实现都非常简单。
-
@Chris911:互斥量不必要地昂贵并且可能阻塞一个线程。有可能实现免等待。
-
@Jakub:您的编辑不正确。读者仍然有可能在作者更改副本的同时制作副本,并看到部分更新的值。
-
你的架构是什么?答案在很大程度上取决于您要使用的硬件。
标签: c++ multithreading atomic