原子操作的意义
对于软件来说,代码的行为必须是确定的,就是说通过手工分析代码也能预知运行结果。但是程序在并发和并行时,因为操作系统任务调度的不确定性和多处理器之间的相互影响,导致代码运行的结果无法预知。这种情况下,只有强制保证某些指令的执行是原子操作,代码运行结果才是可预知的,原子操作也是多任务操作系统设计的基石。正确的使用原子操作,可以避免多任务导致的脏数据,保证代码行为的正确。下面通过一段代码说明为什么程序在并发和并行时需要原子操作。
对于软件来说,代码的行为必须是确定的,就是说通过手工分析代码也能预知运行结果。但是程序在并发和并行时,因为操作系统任务调度的不确定性和多处理器之间的相互影响,导致代码运行的结果无法预知。这种情况下,只有强制保证某些指令的执行是原子操作,代码运行结果才是可预知的,原子操作也是多任务操作系统设计的基石。正确的使用原子操作,可以避免多任务导致的脏数据,保证代码行为的正确。下面通过一段代码说明为什么程序在并发和并行时需要原子操作。
#include <stdio.h>
#include <assert.h>
#include <process.h>
#include <Windows.h>
int g_count1;
volatile long g_count2;
HANDLE h_event;
unsigned int CALLBACK func_callback(void *context);
int main(const int argc, const char *argv[])
{
unsigned long t_id;
HANDLE h[2];
h_event = CreateEvent(NULL, TRUE, FALSE, NULL);
h[0] = (HANDLE)_beginthreadex(NULL, 0, func_callback, NULL, 0, &t_id);
assert(h[0] != INVALID_HANDLE_VALUE);
h[1]