关于竞争条件发生的原因,给出的例子是,一个线程可能访问非最新版本的内存,因为另一个线程可能已经修改了它,或者正在同时修改它。因此,我们使用同步原语或原子变量来保护内存区域。我想知道的是,以下说法是否正确:
任何时候,当单个进程中有多个线程访问同一内存位置时,在任何情况下都必须明确同步。
我明确指的是像互斥锁、原子变量、屏障之类的东西。是这样吗?我之所以问这个问题,是因为当给出线程间同步的例子时,总是以线程在短时间内访问某个内存区域为例,而解释通常是“我们不知道线程 2 是否会看到线程 1 写入的值”。但是,请考虑以下情况:
int some_global_var = 0; // INITIALIZED BEFORE STARTUP
Thread 1:
some_global_var = 1;
Thread 2:
sleep_for(/* 5 days */);
print("%d", some_global_var);
这仍然是一种竞争条件,必须同步,对吧?换句话说,规则很简单,如果它被一个进程中的多个线程访问,没有“如果”、“并且”或“但是”,就必须使用原子变量或互斥锁?
竞争条件的定义非常精确,并且不会调用任何时间组件。如果没有同步原语来阻止竞争条件,竞争条件就可能发生,最终导致未定义的行为。