【问题标题】:is it safe in golang 1.17 to change the pointer receiver's value with atomic swap pointer在golang 1.17中使用原子交换指针更改指针接收器的值是否安全
【发布时间】:2021-08-31 14:19:40
【问题描述】:

golang 1.17 从堆栈更改为寄存器来处理参数

当我使用 atomic.SwapPointer 更改指针接收器的值时是否安全

下面是代码

//like this
func (this *A) Replace(a *A) {
    //other business logic
    //....
    //business logic end
    atomic.SwapPointer((*unsafe.Pointer)(unsafe.Pointer(&this)), unsafe.Pointer(a))
}

【问题讨论】:

  • 不安全就是不安全。你到底想做什么?
  • 附带说明,建议将您的方法接收者命名为thisself
  • 不仅不安全,而且没用。它什么也没做。

标签: go atomic swap receiver


【解决方案1】:

我不认为这是在做你想做的事。从 Go 代码的角度来看,即使是“明智的”不安全代码,您也无法区分寄存器和堆栈 ABI 之间的区别。如果你获取一个参数的地址,如果它还没有在内存中,它将被存储到内存中,这将是它的地址。如果将该地址传递给一个函数,该函数通过将地址存储在全局或堆中来“转义”该地址,那么参数的内存实际上将通过为它分配一个槽并将其存储在那里来获得。如果发生这种情况,随后对该参数的引用将通过隐藏指针间接指向其堆地址。

【讨论】:

    【解决方案2】:

    [I]在 golang 1.17 中使用原子交换指针更改指针接收器的值是否安全 [?]

    没有。根据 unsafe 的定义,使用包 unsafe 是不安全的。

    (“安全”在什么意义上?)

    【讨论】:

    • 对于任何安全的定义来说都是不安全的。
    • 这真的是一个答案吗?这可能只是一条评论
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-22
    • 1970-01-01
    相关资源
    最近更新 更多