2017-03-03 3 views
0

Die Funktion erstellen:Wie UnsafeMutablePointer <UnsafeMutablePointer> in schnellen

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

erfordert eine Art von UnsafeMutablePointer<UnsafeMutableRawPointer?> für den Parameter theValue aber ich habe Probleme, herauszufinden, wie man es von einem Typ machen UnsafeMutablePointer<T?>

Irgendwelche Gedanken darüber, wie ich das tun könnte?

EDIT:

für Neugierige, warum ich versuche, dies zu tun, ich versuche, eine generische Wrapper um dies zu schaffen, eine beschränkte MPMC Warteschlange in swift zu schaffen, wie in diesem blog post skizziert. Hier ist mein Wrapper so weit

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

Warum müssen Sie diese Funktion aufrufen? Bitte zeigen Sie uns den Code, der dies verwendet. – kennytm

+0

@kennytm Ich habe eine Erklärung hinzugefügt –

Antwort

1

In Swift 3, use .withMemoryRebound neu zu interpretieren Güssen, dass "T**" Zeiger auf ein "void**" Zeiger:

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

Beachten Sie, dass

  • OSAtomicCompareAndSwapPtr wurde zugunsten der C11-Funktionen wie atomic_compare_and_exchange_strong, die unfortunately you cannot use in Swift veraltet. Dies ist a known issue.
  • Die atomaren Operationen des Blogposts verwenden "acquire", "release" und auch "relaxed" Speicherreihenfolge. Die OSAtomic-Bibliotheken stellen nur die Reihenfolge "seq_cst" und "relaxed" bereit (die Barrier vs. non-Barrier-Variante jeder Funktion). Ihre Swift-Übersetzung kann also keine 1: 1-Kopie des C++ - Codes sein.

Es gibt auch eine thin wrapper library timehop/Atomics, die für Sie alle gefährlichen Abgüsse versteckt (es ist nicht generisch, jedoch).

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

danke für die Hilfe, gibt es einen Ort, den Sie die Informationen über OSAtomic gefunden oder ist das nur von der Quelle? –

+0

Sie könnten die Hilfeseite überprüfen. ['man 3 atomic_deprecated'] (http://www.manpagez.com/man/3/atomic_deprecated/). Die [Header-Datei] (https://opensource.apple.com/source/Libc/Libc-763.12/include/libkern/OSAtomic.h.auto.html) ist jedoch detaillierter. – kennytm

Verwandte Themen