首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何理解装配级的原子test_and_set?

如何理解装配级的原子test_and_set?
EN

Stack Overflow用户
提问于 2014-11-10 02:17:21
回答 1查看 2K关注 0票数 4

你好,我是gcc的内建原子函数的新手。我用的是test-and-set一号。您可以找到参考这里

以下是一个问题:

我做了这段代码:

代码语言:javascript
复制
#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。我用过:

代码语言:javascript
复制
gcc -S [filename].c

结果是:

代码语言:javascript
复制
        .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不是苹果提供的。(这是我自己编的)

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-10 02:25:21

代码语言:javascript
复制
    movl    $1, -8(%ebp)    # lock = true
    movl    $1, %eax        # true argument
    xchgl   -8(%ebp), %eax  # the test-and-set

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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26835756

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档