小编api*_*api的帖子

golangatomic.Load 有获取语义吗?

给定一个 C++ 代码片段:

\n\n
int a = 0;\natomic<int> b{0};\n\nThread 1                         \na = 1;\nb.store(1,memory_order_release);\n\nThread 2\nwhile(!b.load(memory_order_acquire)); \nassert(a==1);\n
Run Code Online (Sandbox Code Playgroud)\n\n

我们知道断言永远不会触发。

\n\n

另一方面,golangatomic.Store隐含内存屏障的 xchg 指令,因此它可以导致与 c++11 一样的 memory_order_release 语义。

\n\n
//go:noescape\nfunc Store(ptr *uint32, val uint32)\nTEXT runtime\xe2\x88\x95internal\xe2\x88\x95atomic\xc2\xb7Store(SB), NOSPLIT, $0-12\n    MOVQ    ptr+0(FP), BX\n    MOVL    val+8(FP), AX\n    XCHGL   AX, 0(BX)\n    RET\n
Run Code Online (Sandbox Code Playgroud)\n\n

然而, atomic.Load的实现是纯go代码,这意味着汇编时只是mov指令。

\n\n
//go:nosplit\n//go:noinline\nfunc Load(ptr *uint32) uint32 {\n    return *ptr\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

那么,golangatomic.Load有acquire语义吗?
\n如果它是如何工作的,如果不是,如何确保内存排序或使 a=1 可见?

\n

c++ go

6
推荐指数
1
解决办法
1404
查看次数

为什么Golang克隆syscall abi与x86-64上的Linux内核克隆不同

在glibc / sysdeps / unix / sysv / linux / x86_64 / clone.S中的Linux内核克隆abi定义:

The kernel expects:
rax: system call number
rdi: flags
rsi: child_stack
rdx: TID field in parent
r10: TID field in child
r8: thread pointer
Run Code Online (Sandbox Code Playgroud)

在go1.11.5 / src / runtime / sys_linux_amd64.s中的golang克隆系统调用:

// int32 clone(int32 flags, void *stk, M *mp, G *gp, void (*fn)(void));
TEXT runtime·clone(SB),NOSPLIT,$0
    MOVL    flags+0(FP), DI
    MOVQ    stk+8(FP), SI
    MOVQ    $0, DX
    MOVQ    $0, R10

    // Copy mp, gp, fn off parent stack for use …
Run Code Online (Sandbox Code Playgroud)

linux go

5
推荐指数
1
解决办法
243
查看次数

标签 统计

go ×2

c++ ×1

linux ×1