Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何理解汇编级的原子测试_和_集?_C_Gcc_Assembly_X86 - Fatal编程技术网

C 如何理解汇编级的原子测试_和_集?

C 如何理解汇编级的原子测试_和_集?,c,gcc,assembly,x86,C,Gcc,Assembly,X86,嗨,我是gcc内置原子函数的新手。我正在使用测试和设置一。你可以找到参考资料 问题是: 我已经完成了以下代码: #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; } 我打算做的是检查\uuuu sync\u lock\u test\u

嗨,我是gcc内置原子函数的新手。我正在使用
测试和设置
一。你可以找到参考资料

问题是:

我已经完成了以下代码:

#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;
}
我打算做的是检查
\uuuu sync\u lock\u test\u和\u 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_和_set指令在哪里

如你所见,我使用的是gcc-4.8.1,环境是MacOSX10.10(我确信这个gcc不是苹果提供的,我自己编译的)

谢谢

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

它是一种原子交换,返回先前的值(即测试部分),并将
1
写入变量(设置部分)。这用于实现互斥锁。操作完成后,锁将由某个人持有——要么是原始所有者,要么是刚刚获得它的代码。这就是为什么写入
1
值是安全的。将返回原始值,因此您可以区分这两个事件。如果原始值为
0
,则您获得了锁并可以继续,否则您需要等待,因为其他人拥有它。

因此底层原子操作是
xchgl
。。。我明白了,谢谢!