根据 IBM.com 上的一篇文章,“竞争条件是两个或多个线程或进程正在读取或写入某些共享数据的情况,最终结果取决于线程如何调度的时间。竞争条件可以导致不可预测的结果和微妙的程序错误。” . 虽然这篇文章是关于 Java 的,但我通常被教导相同的定义。
据我所知,从 RAM 读取的简单操作包括设置特定输入线的状态(地址、读取等)和读取输出线的状态。这是一个显然不能由两个设备同时执行的操作,必须串行化。
现在让我们假设我们有几个线程访问内存中的对象的情况。理论上,这种访问应该被序列化以防止竞争条件。但是例如读取器/写入器算法假设任意数量的读取器可以同时使用共享内存。
所以,问题是:在使用多线程(例如在 WinAPI 中)时,是否必须为读取实现排他锁?如果不是,为什么?这个控制在哪里实现——操作系统、硬件?
最好的问候,库巴