硬件和软件竞赛条件的一些实际例子是什么? 示例不应该是解释竞争条件是什么的代码,而是系统中的情况。
例如 - 当两个音乐播放器试图访问扬声器时。
答案 0 :(得分:2)
您可以通过https://support.microsoft.com/en-us/help/317723/description-of-race-conditions-and-deadlocks
上的简单示例获得非常好的解释我将引用最重要的部分(说实话,几乎是完整的文章)。
编辑:如果我在这里错了,请有人纠正我。Visual Basic代码:
'Thread 1 Total = Total + val1 'Thread 2 Total = Total - val2
编译中的汇编代码(带行号) 在Visual Basic代码之前:
'Thread 1 1. mov eax,dword ptr ds:[031B49DCh] 2. add eax,edi 3. jno 00000033 4. xor ecx,ecx 5. call 7611097F 6. mov dword ptr ds:[031B49DCh],eax 'Thread 2 1. mov eax,dword ptr ds:[031B49DCh] 2. sub eax,edi 3. jno 00000033 4. xor ecx,ecx 5. call 76110BE7 6. mov dword ptr ds:[031B49DCh],eax
通过查看汇编代码,您可以看到有多少操作 处理器在较低级别执行以执行简单的操作 加法计算。线程可能能够执行全部或部分 它在处理器上的汇编代码。现在看看如何 竞争条件来自此代码。
总计为100,val1为50,val2为15.线程1获得机会 执行但只完成步骤1到3.这意味着 线程1读取变量并完成添加。线程1现在 只是等待写出它的新值150.在线程1之后 停止,线程2完全执行。这意味着它有 将计算出的值(85)写入变量Total。 最后,线程1重新获得控制权并完成执行。它写道 超出它的价值(150)。因此,当线程1完成时,该值 总计现在是150而不是85。
我已经看到你编辑了你的问题来指明你的疑问所以我会相应地扩展我的答案。实际上,有两个音乐播放器试图访问扬声器以输出声音可能没有那么不同,因为有两个线程试图写入stdout
。有一个公共缓冲区,数据被发送到该缓冲区,然后由(在扬声器的情况下)驱动程序处理。 stdout
示例的结果是字符可以交错,并且在扬声器中也会发生相同的情况:声音将被交错,因为它不能同时播放。因此,竞争条件的后果也适用于“系统情况”。