Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

360
Views
¿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 answers
Answer question

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!