gpt4 book ai didi

c - 如何理解汇编级别的原子 test_and_set?

转载 作者:行者123 更新时间:2023-12-01 12:38:57 25 4
gpt4 key购买 nike

嗨,我是 gcc 内置原子函数的新手。我正在使用 test-and-set一。您可以找到引用 here

这是问题:

我已经完成了这个代码:

#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不是苹果提供的,我自己编译的)

谢谢!

最佳答案

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

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

关于c - 如何理解汇编级别的原子 test_and_set?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26835756/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com