你好,我是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;
}我打算做的是检查程序集指令 of __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不是苹果提供的。(这是我自己编的)
谢谢!
发布于 2014-11-10 02:25:21
movl $1, -8(%ebp) # lock = true
movl $1, %eax # true argument
xchgl -8(%ebp), %eax # the test-and-set它是一个原子交换,它返回前一个值(即测试部分),并将1写入变量( set部分)。这用于实现互斥。操作完成后,锁将由某人持有--要么是原来的所有者,要么是您刚刚获得的代码。这就是为什么编写1值是安全的。返回原始值,以便区分这两个事件。如果原始值是0,那么您获得了锁并可以继续,否则您需要等待,因为其他人拥有它。
https://stackoverflow.com/questions/26835756
复制相似问题