【问题标题】:Race Condition Read Write竞争条件 读写
【发布时间】:2016-07-22 06:19:56
【问题描述】:

根据定义,当两个不同的进程尝试同时更改一个共享变量时,就会发生竞争条件,但是即使其中一个进程没有写入而另一个进程也写入,它是否会发生?

例子:

Process X; var.read -> var.change -> var.write Process Y; var.read -> var.change -> var.write

Process X; var.read -> var.change Process Y; var.read -> var.change -> var.write Process X; var.write

两者都应该导致不一致,因为写入发生在其他事情发生时,但是它们都应该导致竞争条件吗?

【问题讨论】:

  • 这取决于您的计算模型,但例如 C11 标准草案 n1570 说:5.1.2.4 多线程执行和数据竞争 4 如果其中一个修改了一个表达式计算,则两个表达式计算冲突内存位置和另一个读取或修改相同的内存位置。[...] 25 如果程序的执行包含不同线程中的两个冲突操作,则程序的执行包含数据竞争,其中至少一个不是原子的,并且两者都不是发生在另一个之前。任何此类数据竞争都会导致未定义的行为。

标签: process operating-system synchronization pthreads race-condition


【解决方案1】:

您可以轻松地与一个作者和同时阅读者建立竞争条件。

假设你希望 y 大于零并且有这样的东西:

GLOBAL X ;

if X > 100 then
   y := x - 50 ;

如果其他人正在写入 x,y 最终可能小于零。

【讨论】: