多线程阅读中的竞争条件怎么样?

时间:2010-04-22 13:20:35

标签: multithreading race-condition

根据IBM.com上的an article,“竞争条件是两个或多个线程或进程正在读取或写入某些共享数据的情况,最终结果取决于线程的时间比赛条件会导致不可预测的结果和微妙的程序错误。“ 。虽然这篇文章涉及Java,但我一般都被教导了相同的定义。

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

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

所以,问题是:在使用多线程时(例如在WinAPI中)是否必须实现读取的独占锁?如果没有,为什么?这个控件在哪里实现 - 操作系统,硬件?

祝你好运, 库巴

3 个答案:

答案 0 :(得分:8)

按顺序读取硬件级别的内存 - 您无需担心此级别的并发性。两个线程发出读取指令和所有必要的东西 - 地址总线上的设置地址和实际读取由内存访问硬件实现,使得读取始终正常工作。

事实上,对于读/写方案也是如此,除了当读取和写入请求是交错的时,您将根据时间获得不同的结果,这就是您需要同步的原因。

答案 1 :(得分:3)

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

答案 2 :(得分:0)

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