|
发表于 2023-11-15 17:15:17
|
显示全部楼层
这个得你去汇编层确认,但目测不太行。
如果变量是寄存器级别,也许可以;但你全局变量一般会被分配到内存区,然后就没法原子操作了:
C语言: time++;
time 是寄存器变量的情形: inc reg;
time 是一般内存变量的情形:
load reg, ramxxx;
inc reg;
store ramxxx, reg;
-----------------------------------------
CPU 一般在汇编一层是原子操作,即一条汇编指令不能被另一条打断。
但你看存储区有个 load - inc -store 这样的三条汇编,就很容易被中断打断。
这样一来高优先级的 store,容易被后续低优先级的 store 再次覆盖掉,导致出错。
-----------------------------------------
在 win32 环境,有专门的 EnterCriticalSection( ) 和 LeaveCriticalSection( ) 接口,就是处理多线程临界区。
每个 Enter 都会在必要时等待,确保其他位置都正确调用了 Leave 才能放行。 |
|