Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

355
Visualizações
¿Este código de ejemplo para g_cond_wait() conducirá a un comportamiento indefinido?

Este es un ejemplo de los documentos de Glib para g_cond_wait() :

 gpointer current_data = NULL; GMutex data_mutex; GCond data_cond; void push_data (gpointer data) { g_mutex_lock (&data_mutex); // (3) current_data = data; g_cond_signal (&data_cond); g_mutex_unlock (&data_mutex); // (4) } gpointer pop_data (void) { gpointer data; g_mutex_lock (&data_mutex); // (1) while (!current_data) g_cond_wait (&data_cond, &data_mutex); // (2) data = current_data; current_data = NULL; g_mutex_unlock (&data_mutex); // (5) return data; }

Pasemos ahora a través de esto:

  • El primer hilo llama a pop_data() , data_mutex está bloqueado (1)
  • Se llama a g_cond_wait() , se desbloquea data_mutex (2), el primer subproceso está esperando
  • El segundo hilo llama a push_data() , data_mutex está bloqueado (3)
  • El segundo subproceso señala al primero que se cumple la condición de espera, desbloquea data_mutex (4)
  • El primer subproceso se activa, sale de g_cond_wait() y desbloquea data_mutex nuevamente (5)

Los documentos dicen que desbloquear un mutex no bloqueado no está definido. ¿Significa esto que el ejemplo contiene un error? ¿O g_cond_wait() bloqueará el mutex antes de salir?

over 4 years ago · Santiago Trujillo
2 Respostas
Responde à pergunta

0

Los documentos dicen que desbloquear un mutex no bloqueado no está definido. ¿Significa esto que el ejemplo contiene un error? ¿O g_cond_wait() bloqueará el mutex antes de salir?

No hay ningún error aquí. No hay desbloqueo de un mutex que no estaba bloqueado en el código. g_cond_wait() bloqueará el mutex cuando regrese.

Thread1 llama a g_cond_wait() con exclusión mutua bloqueada y g_cond_wait() desbloquea atómicamente la exclusión mutua y espera la condición. Después de esto, thread2 bloquea el mutex y realiza la operación, luego envía una señal a thread1 que está esperando en g_cond_wait() . Pero thread1 no puede continuar porque el mutex aún no está disponible (thread2 aún no lo ha desbloqueado). Entonces, después de que la llamada g_mutex_unlock() en thread2 lo desbloquea, g_cond_wait() en thread1 bloquea el mutex y la llamada regresa.

over 4 years ago · Santiago Trujillo Relatório

0

Sí, el mutex se vuelve a bloquear después de la espera. De los documentos simplistas para g_cond_wait() :

Cuando esta función regresa, mutex se bloquea nuevamente y es propiedad del subproceso de llamada.

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda