C++ 读写器锁(c+;+;)

C++ 读写器锁(c+;+;),c++,locking,mutex,C++,Locking,Mutex,我有一个线程连续读取全局变量,还有一个线程偶尔更新(写入)全局变量。 最好的方法是什么?成本是多少? 若我不把锁放在读端,而把锁放在写端,这可能吗 谢谢此场景不需要任何锁。当多个线程修改状态或当多个线程读取某些状态时,您需要锁定,但您希望确保它们读取的是最新版本或相同版本。锁定保护资源/变量,如果读取器使用它,编写器也应该锁定。如果全局变量是基元类型,我建议您使用std::atomic将其设置为原子类型。如果它是一个复杂类型,比如类,那么应该使用锁来确保读卡器读取一致的状态 在您可能期望低争用的

我有一个线程连续读取全局变量,还有一个线程偶尔更新(写入)全局变量。 最好的方法是什么?成本是多少? 若我不把锁放在读端,而把锁放在写端,这可能吗


谢谢

此场景不需要任何锁。当多个线程修改状态或当多个线程读取某些状态时,您需要锁定,但您希望确保它们读取的是最新版本或相同版本。

锁定保护资源/变量,如果读取器使用它,编写器也应该锁定。如果全局变量是基元类型,我建议您使用std::atomic将其设置为原子类型。如果它是一个复杂类型,比如类,那么应该使用锁来确保读卡器读取一致的状态


在您可能期望低争用的情况下,我在自旋锁方面取得了很大成功。但是如果你的读者阅读率很高,而你有很多读者。应该使用互斥或原子。

以前有人问过:@idfah一个问题真的能复制它自己吗?:)@JoachimIsaksson Isaksson Oops,剪切和粘贴错误。再试一次,这是错误的。一旦从多线程访问单个资源,您就需要锁(或其他一些同步机制),其中一个线程可以修改此资源。问题就是这样。请再读一遍原始帖子。他没有提出任何理论问题。他有一个线程写一个全局变量,还有一个线程读它。这不需要锁定。不要像对待银弹一样对待锁定!你好,未定义的行为。。。因为问题中没有定义,克里斯蒂安,你错了。除非读/写操作是原子的,否则即使有一个写入线程和一个读取线程,也需要同步机制。考虑一个非原子写操作,它在2个步骤中改变值。如果写入线程在第一步后被抢占,允许读线程CPU时间,则对象的状态是未定义的。是的,您是对的。我在想int或指针,它只是一个寄存器大小的数字。当我回复你的时候,我想确保写一个int确实是原子的,而且令人惊讶:“它可能不是!”