代码之家  ›  专栏  ›  技术社区  ›  Lightsout

全局变量多读一写多线程安全?

  •  0
  • Lightsout  · 技术社区  · 7 年前

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

    同时,我是一个信号新手,所以我需要节省自己的麻烦,如果可能的话。

    程序如下: writer线程:持续检查pin是否有高电压,高电压时设置全局变量

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

    3 回复  |  直到 7 年前
        1
  •  2
  •   Pete Becker    7 年前

    其简单之处在于:如果多个线程可以同时访问一个对象而无需同步,并且其中至少有一个线程正在向该对象写入数据,则该程序会发生数据竞争。具有数据竞争的程序的行为是未定义的。

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

    如果不正确地同步读写操作,您可以享受流行的室内游戏“猜猜这个程序可能做什么”。有很多消息线程可以解释为什么在某些情况下数据竞争是正常的。如果你真的不在乎你的程序是否能正常工作,那就没问题了。如果你真的在乎,同步。

        2
  •  0
  •   Alex Reinking    7 年前

    很难说不知道什么会构成 对的 你的特殊情况下的程序。但事实上,只要只有一个并发的writer,就不必担心会损坏内存。

    不过,多个读卡器将在不锁定的情况下获得不确定的值。你肯定想用 atomic loads (seq_cst, most likely) and stores 对于这个值,您可能需要查看 volatile 关键字以防止在应用程序中出现此问题时将值存储在寄存器中。

        3
  •  0
  •   Pavel P    7 年前

    您需要提供更多的上下文,但是一般来说,您应该使用类似于 std::mutex 是的。如果您不关心某个线程是否读取了错误的值,那么您可以放宽需求,但这一切都取决于您的用例。

    您可以将问题中的“多个读卡器”简化并替换为“单个读卡器”,答案仍然是:您必须保护来自不同线程对共享变量的访问,否则读卡器线程可能不会“观察”由写卡器线程所做的更改,而实际上最终会读取并使用错误的值。

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