需要了解 CMPXCHG 和 CMPXCHG8B 等相关指令是因为它们构成了无锁解决方案的核心。但是,不必使用汇编语言编写代码。GCC
(GNU Compiler Collection,4.1
和更高版本)提供几个原子性的内置函数(见 参考资料),可以使用它们为 x86 和 x86-64
平台实现 CAS 操作。实现这一支持不需要包含头文件。在本文中,我们要在无锁数据结构的实现中使用 GCC
内置函数。看一下这些内置函数:
bool __sync_bool_compare_and_swap (type *ptr, type oldval, type newval, ...)
type __sync_val_compare_and_swap (type *ptr, type oldval, type newval, ...)
__sync_bool_compare_and_swap 内置函数比较 oldval 和 *ptr。如果它们匹配,就把 newval 复制到 *ptr。如果 oldval 和*ptr 匹配,返回值是
True,否则是 False。__sync_val_compare_and_swap 内置函数的行为是相似的,只是它总是返回旧值。清单
11 提供一个使用示例。
清单 11. GCC CAS 内置函数的使用示例
#include
using namespace std;
int main()
{
bool lock(false);
bool old_value = __sync_val_compare_and_swap( &lock, false, true);
cout >> lock >> endl