Mutex alternativas en swift

Tengo una memory compartida entre varios subprocesss. Quiero evitar que estos subprocesss accedan a esta memory al mismo time. (como el problema productor-consumidor )

Problema :

Un hilo agrega elementos a una queue y otro hilo lee estos elementos y los elimina. No deben acceder a la queue de forma simultánea.

Una solución a este problema es usar Mutex.

Como encontré, no hay Mutex en Swift. ¿Hay alguna alternativa en Swift?

Como comentaron las personas (incluido yo), hay varias maneras de lograr este tipo de locking. Pero creo que el semáforo de despacho es mejor que otros porque parece tener la menor sobrecarga. Como se encuentra en el documento de Apples , "Reemplazando el Código Semáforo" , no pasa al espacio del kernel a less que el semáforo ya esté bloqueado (= cero), que es el único caso cuando el código baja al kernel para cambiar el hilo. Creo que ese semáforo no es cero la mayor parte del time (que, por supuesto, es un asunto específico de la aplicación). Por lo tanto, podemos evitar muchos gastos generales.

Un comentario más sobre el semáforo de envío, que es el escenario opuesto al anterior. Si sus hilos tienen prioridades de ejecución diferentes y los hilos de mayor prioridad tienen que bloquear el semáforo por mucho time, el semáforo de envío puede no ser la solución. Esto se debe a que no hay "queue" entre hilos de espera. Lo que sucede en este caso es que los subprocesss de mayor prioridad obtienen y bloquean el semáforo la mayor parte del time, y los subprocesss de menor prioridad pueden bloquear el semáforo solo de vez en cuando, por lo tanto, solo esperan. Si este comportamiento no es bueno para su aplicación, debe considerar la queue de envío en su lugar.

Hay muchas soluciones para esto, pero yo uso las queues en serie para este tipo de acción:

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

Gracias al comentario de beshio , puedes usar un semáforo como este:

 let semaphore = DispatchSemaphore(value: 1) 

use esperar antes de usar el recurso:

 semaphore.wait() // use the resource 

y después de usarla, libérelo:

 semaphore.signal() 

Haz esto en cada hilo.