如何迅速

问题描述:

创建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 
+0

为什么你需要调用这个函数?请向我们展示使用此的代码。 – kennytm

+0

@kennytm我已经添加了一个解释 –

在斯威夫特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) 
+0

感谢您的帮助,是否有一个地方,你找到了OSAtomic的信息,或者只是从源头上看? –

+0

您可以查看联机帮助页。 ['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