如何迅速
创建UnsafeMutablePointer
public func OSAtomicCompareAndSwapPtr(_ __oldValue: UnsafeMutableRawPointer!, _ __newValue: UnsafeMutableRawPointer!, ___theValue: UnsafeMutablePointer<UnsafeMutableRawPointer?>!) -> Bool
需要的参数theValue
一种类型的UnsafeMutablePointer<UnsafeMutableRawPointer?>
但我有麻烦找出如何使一个从类型UnsafeMutablePointer<T?>
有关我如何做到这一点的任何想法?
编辑:
的好奇,为什么我试图做到这一点,我想创建一个围绕这一个通用的包装中迅速建立在这个blog post勾勒出界MPMC队列。这里是我的包装到目前为止
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
在斯威夫特3,use .withMemoryRebound
重新诠释铸说, “T**
” 指针 “void**
” 指针:
return toPtr.withMemoryRebound(to: (UnsafeMutableRawPointer?).self, capacity: 1) {
OSAtomicCompareAndSwapPtr(currentPtr, futurePtr, $0)
}
注意
- OSAtomicCompareAndSwapPtr已被弃用,以支持C11功能,如
atomic_compare_and_exchange_strong
,其中unfortunately you cannot use in Swift。这是a known issue。 - 博客文章的原子操作使用“获取”,“释放”以及“放宽”的内存顺序。 OSAtomic库仅提供“seq_cst”和“宽松”顺序(每个函数的障碍vs非障碍变体)。所以你的Swift翻译不能成为C++代码的1:1功能拷贝。
还有一个thin wrapper library timehop/Atomics
其隐藏所有你的危险铸件(它不是通用的,不过)。
var toPtr = HOPAtomicReference(object: ...)
...
return toPtr.compareTo(current, andSetObject: future)
感谢您的帮助,是否有一个地方,你找到了OSAtomic的信息,或者只是从源头上看? –
您可以查看联机帮助页。 ['man 3 atomic_deprecated'](http://www.manpagez.com/man/3/atomic_deprecated/)。尽管如此,[头文件](https://opensource.apple.com/source/Libc/Libc-763.12/include/libkern/OSAtomic.h.auto.html)更详细。 – kennytm
为什么你需要调用这个函数?请向我们展示使用此的代码。 – kennytm
@kennytm我已经添加了一个解释 –