首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何快速创建UnsafeMutablePointer<UnsafeMutablePointer>

如何快速创建UnsafeMutablePointer<UnsafeMutablePointer>
EN

Stack Overflow用户
提问于 2017-03-03 17:38:24
回答 1查看 528关注 0票数 0

职能:

代码语言:javascript
复制
public func OSAtomicCompareAndSwapPtr(_ __oldValue: UnsafeMutableRawPointer!, _ __newValue: UnsafeMutableRawPointer!, ___theValue: UnsafeMutablePointer<UnsafeMutableRawPointer?>!) -> Bool

需要a参数UnsafeMutablePointer<UnsafeMutableRawPointer?>的类型theValue,但是我很难从类型UnsafeMutablePointer<T?>中找到一个

对我怎么做有什么想法吗?

编辑:

出于对我为什么要这样做的好奇,我尝试创建一个通用的包装器,以便像这个博客帖子中所概述的那样,快速地创建一个有限的MPMC队列。到目前为止,这是我的包装

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-03 18:35:08

在Swift 3中,.withMemoryRebound重新解释"T**“指针到"void**”指针:

代码语言:javascript
复制
return toPtr.withMemoryRebound(to: (UnsafeMutableRawPointer?).self, capacity: 1) {
    OSAtomicCompareAndSwapPtr(currentPtr, futurePtr, $0)
}

请注意,

  • OSAtomicCompareAndSwapPtr已经被反对,转而支持C11函数,比如atomic_compare_and_exchange_strong,它是不幸的是你不能在Swift中使用。我是一个已知的问题
  • 博客文章的原子操作使用“获取”、“发布”以及“轻松”的内存顺序。OSAtomic库只提供"seq_cst“和”轻松“顺序(每个函数的变体)。因此,您的Swift翻译不能是C++代码的1:1功能副本。

还有一个timehop/Atomics,它为您隐藏了所有危险的类型(但是,它不是通用的)。

代码语言:javascript
复制
var toPtr = HOPAtomicReference(object: ...)
...
return toPtr.compareTo(current, andSetObject: future)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42585231

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档