About pthread_cond_signal and pthread_cond_wait

前端 未结 2 1721
一向
一向 2021-01-03 16:37

I have questions about pthread_cond_signal and pthread_cond_wait. For example, in the code below, According to my understanding, when

相关标签:
2条回答
  • 2021-01-03 16:45

    pthread_cond_wait() unlocks the mutex on entry and locks it again on exit. If another thread acquires the lock during that time, pthread_cond_wait() cannot return until that other thread has released the lock.

    So, if watch_count() is blocked in pthread_cond_wait(), and inc_count() runs and calls pthread_cond_signal(), then watch_count() will not return from pthread_cond_wait() until inc_count() has called pthread_mutex_unlock().

    However, pthread_cond_wait() can wake even if not signalled. This is called a spurious wake-up. watch_count() can therefore execute count+=125 many times, even if inc_count() never runs, or never calls pthread_cond_signal().

    0 讨论(0)
  • 2021-01-03 17:01

    count += 125 in watch_count can be executed only after count_mutex is unlocked in inc_count

    Yes.

    The count_mutex was unlocked in watch_count when pthread_cond_wait executed and only gets locked after pthread_mutex_unlock in inc_count is executed.

    Yes, in the sense that when pthread_cond_wait returns watch_count holds the mutex, and thus it will only return after inc_count has unlocked the mutex. (Provided COUNT starts out below COUNT_LIMIT when the while is first reached..)

    BTW: This code hurts my head a little. I really wouldn't recommend modifying count in watch_count as the control flow could get hard to figure out if you ever have more than one thread running that function and you start to use pthread_cond_broadcast.

    0 讨论(0)
提交回复
热议问题