gpt4 book ai didi

swift - 如何快速创建 UnsafeMutablePointer

转载 作者:行者123 更新时间:2023-11-28 15:49:04 31 4
gpt4 key购买 nike

函数:

public func OSAtomicCompareAndSwapPtr(_ __oldValue: UnsafeMutableRawPointer!, _ __newValue: UnsafeMutableRawPointer!, ___theValue: UnsafeMutablePointer<UnsafeMutableRawPointer?>!) -> Bool

需要 UnsafeMutablePointer<UnsafeMutableRawPointer?> 的类型对于参数 theValue但我无法弄清楚如何用 UnsafeMutablePointer<T?> 类型制作一个

关于如何做到这一点有什么想法吗?

编辑:

出于对我为什么尝试这样做的好奇,我正在尝试围绕它创建一个通用包装器,以快速创建一个有界 MPMC 队列,如本 blog post 中所述。 .到目前为止,这是我的包装

func compareAndSwap<T: AnyObject>(current: T?, future: T?, toPtr: UnsafeMutablePointer<T?>) -> Bool {
let currentPtr = current.map(Unmanaged.passUnretained)?.toOpaque()
let futurePtr = future.map(Unmanaged.passRetained)?.toOpaque()

if OSAtomicCompareAndSwapPtr(currentPtr, futurePtr, ????) {
return true
}
return false

最佳答案

在 Swift 3 中,use .withMemoryRebound将“T**”指针重新解释为“void**”指针:

return toPtr.withMemoryRebound(to: (UnsafeMutableRawPointer?).self, capacity: 1) {
OSAtomicCompareAndSwapPtr(currentPtr, futurePtr, $0)
}

注意

  • OSAtomicCompareAndSwapPtr 已被弃用,取而代之的是 C11 函数,如 atomic_compare_and_exchange_strongunfortunately you cannot use in Swift .这是 a known issue .
  • 博文的原子操作使用“获取”、“释放”和“放宽”内存顺序。 OSAtomic 库仅提供“seq_cst”和“松弛”顺序(每个函数的 Barrier 与非 Barrier 变体)。因此,您的 Swift 翻译不能是 C++ 代码的 1:1 功能副本。

还有一个thin wrapper library timehop/Atomics它为您隐藏了所有危险的转换(但是它不是通用的)。

var toPtr = HOPAtomicReference(object: ...)
...
return toPtr.compareTo(current, andSetObject: future)

关于swift - 如何快速创建 UnsafeMutablePointer<UnsafeMutablePointer>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42585231/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com