¿Cómo implementar un mecanismo de bloqueo reentrante en object-c mediante GCD?

Tengo una clase de objetivo-c con algunos métodos, que utilizan una cola GCD para garantizar que los accesos simultáneos a un recurso se realicen en serie (forma estándar de hacerlo).

Algunos de estos métodos necesitan llamar a otros métodos de la misma clase. Así que el mecanismo de bloqueo debe ser reingresado. ¿Hay una manera estándar de hacer esto?

Al principio, tuve cada uno de estos métodos de uso

dispatch_sync(my_queue, ^{

   // Critical section

});

sincronizar accesos. Como saben, cuando uno de estos métodos llama a otro método similar, se produce un interbloqueo porque la llamada dispatch_sync detiene la ejecución actual hasta que se ejecuta ese otro bloque, lo que no se puede ejecutar también, porque se detiene la ejecución en la cola. Para resolver esto, utilicé, por ejemplo, este método:

- (void) executeOnQueueSync:(dispatch_queue_t)queue : (void (^)(void))theBlock {
    if (dispatch_get_current_queue() == queue) {
        theBlock();
    } else {
        dispatch_sync(queue, theBlock);
    }
}

Y en cada uno de mis métodos, uso.

[self executeOnQueueSync:my_queue : ^{

   // Critical section

}];

No me gusta esta solución, porque para cada bloque con un tipo de retorno diferente, necesito escribir otro método. Además, este problema me parece muy común y creo que debería existir una solución estándar más agradable para esto.

Respuestas a la pregunta(1)

Su respuesta a la pregunta