2017-03-03 89 views
0

創建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我已經添加了一個解釋 –

回答

1

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