es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Bloqueo en el hilo principal al usar el semáforo ObjC.

Soy un traductor de español que traduce documentos de TI. Traduzca lo siguiente al español. No traduzca el código y la salida en markdown.

Soy nuevo en Xcode y ObjectiveC y estoy construyendo una herramienta no UI. Encontré que mi hilo principal se colgará para siempre y nunca se despertará cuando estoy usando semáforos en el hilo principal.

      dispatch_semaphore_t waitSem = dispatch_semaphore_create(0);

  dispatch_async(dispatch_get_main_queue(), ^{

    // hacer algo más
    dispatch_semaphore_signal(waitSem);

  });

  dispatch_wait(waitSem, DISPATCH_TIME_FOREVER);
Tags:  ,

Answer

  1. Avatar for davy.ai

    El problema aquí es que se está llamando a dispatch_wait en el hilo principal, lo que está causando un bloqueo. La función dispatch_wait se bloquea hasta que se recibe la señal del semáforo, pero como la llamada a dispatch_semaphore_signal también está en el hilo principal y aún no ha sido alcanzada, el hilo principal no puede avanzar desde la llamada a dispatch_wait.

    Una solución a esto es utilizar un hilo de fondo para la llamada a dispatch_wait. Esto se puede hacer mediante la creación de un bloque que espera en el semáforo con dispatch_async y, a continuación, ejecutar ese bloque en un hilo de fondo utilizando dispatch_async de nuevo.

    dispatch_semaphore_t waitSem = dispatch_semaphore_create(0);
    
    dispatch_async(dispatch_get_main_queue(), ^{
        // hacer algo más
        dispatch_semaphore_signal(waitSem);
    });
    
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        dispatch_wait(waitSem, DISPATCH_TIME_FOREVER);
    });
    

    En este código, el hilo principal se utiliza para señalar el semáforo, pero la espera se realiza en un hilo de fondo. De esta manera, el hilo principal puede continuar su trabajo mientras que el hilo de fondo espera a que se reciba la señal del semáforo.

    Es importante tener en cuenta que el uso de dispatch_wait y semáforos puede ser una operación de bloqueo, y se debe usar cuidadosamente para evitar bloqueos y otros problemas. Se recomienda considerar otras soluciones asíncronas si es posible, como el uso de controladores de finalización o grupos de despacho.

Comments are closed.