我对pthread_cond_signal和pthread_cond_wait有疑问.例如,在下面的代码,根据我的理解,当inc_count的调用调用pthread_cond_signal,计数+ = 125在WATCH_COUNT部只能之后执行count_mutex在解锁inc_count的.
该count_mutex在解锁WATCH_COUNT部时调用pthread_cond_wait执行,仅在被锁定调用pthread_mutex_unlock在inc_count的执行.我对吗?
void *inc_count(void *t)
{
int i;
long my_id = (long)t;
for (i = 0; i < TCOUNT; i++)
{
pthread_mutex_lock(&count_mutex);
count++;
if (count == COUNT_LIMIT)
{
pthread_cond_signal(&count_threshold_cv);
}
pthread_mutex_unlock(&count_mutex);
}
pthread_exit(NULL);
}
void *watch_count(void *t)
{
long my_id = (long)t;
pthread_mutex_lock(&count_mutex);
while (count < COUNT_LIMIT)
{
pthread_cond_wait(&count_threshold_cv, &count_mutex);
count += 125;
}
pthread_mutex_unlock(&count_mutex);
pthread_exit(NULL);
}
Run Code Online (Sandbox Code Playgroud)
pthread_cond_wait()在进入时解锁互斥锁并在退出时再次锁定它.如果另一个线程在此期间获得锁定,则在pthread_cond_wait()其他线程释放锁定之前无法返回.
因此,如果watch_count()被阻止pthread_cond_wait(),以及inc_count()运行和调用pthread_cond_signal(),那么watch_count()将不会从返回pthread_cond_wait()到inc_count()已呼吁pthread_mutex_unlock().
但是,pthread_cond_wait()即使没有发出信号,也可以唤醒.这被称为虚假唤醒.watch_count()因此可以执行count+=125多次,即使inc_count()从不运行,也从不调用pthread_cond_signal().
| 归档时间: |
|
| 查看次数: |
8996 次 |
| 最近记录: |