10.4.3 atomic
现在回到我最喜欢的同步议题,即原子整型操作上来。一个可能的语言扩展是引入atomic关键字,以便支持如下形式的代码:
- atomic j = ++i; // 等价于 j = atomic_preincrement(&i)
或者,还可以使用XOR互换技巧,
- atomic j ^= i ^= j ^= i; // 等价于 j = atomic_write(&i, j);
编译器负责确保这些代码被转换成目标平台上的恰当的原子操作。2遗憾的是,处理器指令集之间的差异意味着我们要么忍受不可移植的代码,要么就得面对只有少数操作适合被选作原子操作的现实。我们当然不愿意编译器除了在可能的时候使用轻量级的方案外,在实现其他操作的时候就一声不吭地使用共享的互斥体(来进行锁定和解锁)。对于后者,最好能在代码中显式地表达出来,就像我们现在所做的那样。
如果C/C++(www.cppentry.com)中有一个atomic关键字将是一件好事,它对应于所有架构都具有的(有限的)一组原子整型操作。然而,使用atomic_*函数也不算难,并且与关键字形式相比或许还要更可读一些。其仅有的一个实际缺陷是这一组原子整型操作并非对所有平台都是强制性存在的。很可能C/C++(www.cppentry.com)标准的下一代版本会引入它们。