13

根据 IBM.com 上的一篇文章,“竞争条件是两个或多个线程或进程正在读取或写入某些共享数据的情况,最终结果取决于线程如何调度的时间。竞争条件可以导致不可预测的结果和微妙的程序错误。” . 虽然这篇文章是关于 Java 的,但我通常被教导相同的定义。

据我所知,从 RAM 读取的简单操作包括设置特定输入线的状态(地址、读取等)和读取输出线的状态。这是一个显然不能由两个设备同时执行的操作,必须串行化。

现在让我们假设我们有几个线程访问内存中的对象的情况。理论上,这种访问应该被序列化以防止竞争条件。但是例如读取器/写入器算法假设任意数量的读取器可以同时使用共享内存。

所以,问题是:在使用多线程(例如在 WinAPI 中)时,是否必须为读取实现排他锁?如果不是,为什么?这个控制在哪里实现——操作系统、硬件?

最好的问候,库巴

4

3 回答 3

10

在硬件级别读取内存是按顺序完成的 - 您无需担心此级别的并发性。两个线程发出读取指令和所有必要的东西——在地址总线上设置地址和实际读取是由内存访问硬件实现的,读取总是正确的。

事实上,读/写场景也是如此,除了当读和写请求交错时,您会根据时间得到不同的结果,这就是您需要同步的原因。

于 2010-04-22T13:22:58.230 回答
4

只要没有改变数据,从多个线程读取它是完全安全的。即使两个 CPU(或内核)竞相以完全相同的时钟周期访问内存以进行读取,它们的访问也将由内存控制器串行化,并且它们不会相互干扰。此功能对于硬件正常工作至关重要。

于 2010-04-22T13:31:56.717 回答
0

这个问题没有一个简单的答案。不同的 API(和不同的环境)将具有不同级别的多线程感知和多线程安全性。

于 2010-04-22T13:23:06.620 回答