我正在尝试理解原子操作和非原子操作。涉及操作系统和C语言方面的内容。根据维基百科页面这里所述。
考虑一个简单的计数器,多个进程可以对其进行递增。
非原子操作 朴素的非原子实现:
读取内存位置中的值;
将值加一;
将新值写回内存位置。
现在,想象两个进程正在运行并递增单个共享内存位置:
第一个进程读取内存位置中的值;
第一个进程将值加一;
但在它写入新值回到内存位置之前被挂起,第二个进程被允许运行:
第二个进程读取内存位置中的值,与第一个进程读取的相同;
第二个进程将值加一;
第二个进程将新值写入内存位置。
如何将上述操作变为原子操作?我理解的原子操作是指能够无中断地执行的任何操作。例如:
考虑一个简单的计数器,多个进程可以对其进行递增。
非原子操作 朴素的非原子实现:
读取内存位置中的值;
将值加一;
将新值写回内存位置。
现在,想象两个进程正在运行并递增单个共享内存位置:
第一个进程读取内存位置中的值;
第一个进程将值加一;
但在它写入新值回到内存位置之前被挂起,第二个进程被允许运行:
第二个进程读取内存位置中的值,与第一个进程读取的相同;
第二个进程将值加一;
第二个进程将新值写入内存位置。
如何将上述操作变为原子操作?我理解的原子操作是指能够无中断地执行的任何操作。例如:
int b=1000;
b+=1000;
根据我的理解,应该是原子操作,因为两个指令都没有中断地执行,但我从某人那里学到,在C语言中没有所谓的原子操作,因此上述两个语句都不是原子操作。那么我想要了解的是,当涉及编程语言时,原子性与操作系统有何不同?