golang 的copyCheck.check如何检测对象复制?
// copyChecker holds back pointer to itself to detect object copying.
type copyChecker uintptr
func (c *copyChecker) check() {
if uintptr(*c) != uintptr(unsafe.Pointer(c)) &&
!atomic.CompareAndSwapUintptr((*uintptr)(c), 0, uintptr(unsafe.Pointer(c))) &&
uintptr(*c) != uintptr(unsafe.Pointer(c)) {
panic("sync.Cond is copied")
}
}
创建时,它将其值设置为自己的地址。为了检查它是否被复制,它将其地址与存储的值进行比较。如果它被复制,它的地址将不同,但值将相同,因此它将不再指向自己。
好的,那么,首先看一下copyChecker
的对象是什么:它是一个uintptr
。所以,有一个关键点:声称在第一次使用后不能复制该东西。每个“使用”(导出的方法)都从调用检查对象的checker
的类型开始。
实际检查的工作原理:
这意味着第一次被击中,c
是零,所以它也不等于地址c
实际上是在。有一个原子交换,当且仅当当前值为零时交换c
的地址,并确保这是以原子方式发生的。如果c
为零,则第一个比较可以成功。
本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处
评论列表(81条)