快速替代互斥

我有多个线程之间的共享内存。 我想阻止这些线程同时访问这块内存。 (如生产者 – 消费者问题)

问题

一个线程将元素添加到队列中,另一个线程读取这些元素并将其删除。 他们不应该同时访问队列。

解决这个问题的一个办法是使用Mutex。

正如我所发现的,Swift中没有互斥体。 Swift中有没有其他的select?

正如人们所评论的(包括我),有几种方法可以实现这种locking。 但是我认为调度信号比其他的更好,因为它似乎有最小的开销。 正如在Apples 文档“replace信号代码”中所发现的,除非信号已经被locking(=零),否则不会进入内核空间,这是代码进入内核切换线程的唯一情况。 我认为大多数时候信号量不是零(这当然是应用程序特定的问题)。 因此,我们可以避免大量的开销。

还有一点就是调度信号量,这是与上面相反的情况。 如果你的线程具有不同的执行优先级,并且优先级较高的线程必须长时间locking信号量,调度信号量可能不是解决scheme。 这是因为在等待线程中没有“队列”。 在这种情况下会发生什么情况:优先级较高的线程大多数时间获取和locking信号量,较低优先级的线程只能偶尔locking信号量,因此大多数情况下只是在等待。 如果这种行为不适合您的应用程序,则必须考虑调度队列。

有很多这样的解决scheme,但我使用串行队列这种行动:

 let serialQueue = DispatchQueue(label: "queuename") serialQueue.sync { //call some code here, I pass here a closure from a method } 

感谢beshio的评论,你可以像这样使用信号量:

 let semaphore = DispatchSemaphore(value: 1) 

使用资源前请使用wait:

 semaphore.wait() // use the resource 

并在使用后释放它:

 semaphore.signal() 

在每个线程中执行此操作。

    Interesting Posts