如何理解汇编级别的原子操作test_and_set?

5

你好,我刚开始接触gcc内置的原子函数,并正在使用test-and-set函数。你可以在这里找到参考文档。

以下是问题描述:

我已经写了下面的代码:

#define bool int
#define true 1
#define false 0

int main() {
    bool lock = true;
    bool val = __sync_lock_test_and_set(&lock, true);

    return 0;
}

我的意图是检查__sync_lock_test_and_set汇编指令。我已经使用了:

gcc -S [filename].c

结果如下:

        .file   "test_and_set.c"
        .file   "test_and_set.c"
        .text
        .globl  main
        .type   main, @function
main:
.LFB0:
        .cfi_startproc
        pushl   %ebp
        .cfi_def_cfa_offset 8
        .cfi_offset 5, -8
        movl    %esp, %ebp
        .cfi_def_cfa_register 5
        subl    $16, %esp
        movl    $1, -8(%ebp)
        movl    $1, %eax
        xchgl   -8(%ebp), %eax
        movl    %eax, -4(%ebp)
        movl    $0, %eax
        leave
        .cfi_restore 5
        .cfi_def_cfa 4, 4
        ret
        .cfi_endproc
.LFE0:
        .size   main, .-main
        .ident  "GCC: (GNU) 4.8.1"

然而,我找不到test_and_set指令在哪里...

正如您所见,我正在使用gcc-4.8.1,并且环境是MAC OSX 10.10(我确定这个gcc不是Apple提供的。我自己编译的)

谢谢!

1个回答

7
    movl    $1, -8(%ebp)    # lock = true
    movl    $1, %eax        # true argument
    xchgl   -8(%ebp), %eax  # the test-and-set

这是一个原子交换,返回先前的值(这是测试部分),并将 1 写入变量(设置部分)。这被用于实现互斥。操作完成后,锁将被某人持有 - 可能是原始所有者或者您刚刚获得它的代码。因此,安全地写入一个 1 值。原始值会返回,因此可以区分这两个事件。如果原始值是 0,则您已获取锁并可以继续执行,否则您需要等待,因为其他人正在使用锁。

所以底层的原子操作是 xchgl ... 我明白了,谢谢! - VELVETDETH

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接