全局变量 多读取器 一个写入器多线程安全?



我正在尝试用一个全局变量编写一个程序,C++一个全局变量被多个线程读取并由一个线程更新。 在这种情况下,我是否需要编写任何信号量之类的东西,或者我可以保持原样,因为实际上只有 1 个线程写入全局变量,因此没有可能的竞争条件。

我也是信号灯的新手,所以如果可能的话,我需要省去麻烦。

程序是这样的: 写入器线程:不断检查引脚是否高电压,高电平时设置全局变量

读取器线程:在无限循环中不断检查全局变量,并在设置时执行某些操作。

这很简单:如果多个线程可以在不同步的情况下同时访问一个对象,并且其中至少有一个线程正在写入该对象,则程序存在数据竞争。具有数据争用的程序的行为是未定义的。

可以通过防止使用互斥锁同时访问来提供同步,或者在许多情况下,通过使用原子对象来提供同步。

如果您没有正确同步读取和写入,您可以享受流行的客厅游戏"猜测这个程序可能会做什么"。有许多消息线程提供了合理化,说明为什么在某些情况下数据争用是可以的。如果你真的不在乎你的程序是否真的正常工作,那很好。如果您确实关心,请同步。

如果不知道在您的特定情况下什么构成正确的程序,就很难说。但确实,只要只有一个并发写入器,就不必担心损坏内存。

但是,多个读取器将获得不确定的值而不会锁定。您肯定希望使用原子负载(很可能是seq_cst(并存储到值,并且您可能希望查看volatile关键字以防止将值存储在寄存器中(如果这是应用程序中的问题(。

您需要提供更多上下文,但通常您应该使用某种同步原语(如 std::mutex(来保护对此变量的访问。如果您不关心某些线程是否可能读取不正确的值,则可以放宽要求,但这完全取决于您的用例。

你可以用"单个阅读器"来简化和替换问题中的"多个阅读器",答案仍然是:你必须保护来自不同线程对共享变量的访问,否则读者线程可能不会"观察"编写器线程所做的更改,基本上最终读取和使用错误的值。

如果它是一个你试图从线程中读取/修改的简单整数,那么你可以使用std::atomic。

相关内容

  • 没有找到相关文章

最新更新