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

时间:2018-10-26 00:15:27

标签: c++ multithreading race-condition

我正在尝试用C ++编写程序,其中一个全局变量由多个线程读取并由一个线程更新。在这种情况下,我是否需要编写任何类似信号量的东西,还是可以直接保留它,因为实际上只有1个线程正在向全局变量写入数据,所以没有可能的竞争条件。

我还是信号量的新手,因此,如果可能,我需要避免麻烦。

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

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

3 个答案:

答案 0 :(得分:2)

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

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

如果您没有正确同步读写操作,则可以享受流行的客厅游戏“猜测此程序可能会做什么”。有许多消息线程可以合理化说明为什么在某些情况下数据竞速仍然可以进行。如果您不太在意程序是否真正正常运行,那就很好。如果您愿意的话,请进行同步。

答案 1 :(得分:0)

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

您可以用“单个阅读器”简化和替换问题中的“多个阅读器”,答案仍然是:您必须保护从不同线程访问共享变量,否则阅读器线程可能无法“观察”编写者线程所做的更改,最终导致读取和使用错误的值。

如果您尝试从线程中读取/修改它是一个简单的整数,则可以使用std::atomic

答案 2 :(得分:0)

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

但是,多个读取器将获得不确定的值而不会锁定。您肯定希望对值使用atomic loads (seq_cst, most likely) and stores,并且如果您的应用程序有此顾虑,您可能希望调查volatile关键字以防止将值存储在寄存器中。