Copycheck查重:golang的copyCheck.check如何检测对象复制

关于Copycheck查重的问题,在copying checker中经常遇到, golang 的copyCheck.check如何检测对象复制?

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")
    }
}
1

创建时,它将其值设置为自己的地址。为了检查它是否被复制,它将其地址与存储的值进行比较。如果它被复制,它的地址将不同,但值将相同,因此它将不再指向自己。

1

好的,那么,首先看一下copyChecker的对象是什么:它是一个uintptr。所以,有一个关键点:声称在第一次使用后不能复制该东西。每个“使用”(导出的方法)都从调用检查对象的checker类型开始。

实际检查的工作原理:

这意味着第一次被击中,c是零,所以它也不等于地址c实际上是在。有一个原子交换,当且仅当当前值为零时交换c的地址,并确保这是以原子方式发生的。如果c为零,则第一个比较可以成功。

本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处

(269)
镀锌c型钢加工:有没有办法在 C#中添加工具提示到Excel单元格数据
上一篇
被狙击的女神天使cg:我已经完成了我的狙击命令 它可以狙击图像吗
下一篇

相关推荐

发表评论

登录 后才能评论

评论列表(81条)