关于pthread_cond_signal和pthread_cond_wait

Met*_*est 1 c linux pthreads

我对pthread_cond_signalpthread_cond_wait有疑问.例如,在下面的代码,根据我的理解,当inc_count的调用调用pthread_cond_signal,计数+ = 125WATCH_COUNT部只能之后执行count_mutex在解锁inc_count的.

count_mutex在解锁WATCH_COUNT部调用pthread_cond_wait执行,仅在被锁定调用pthread_mutex_unlockinc_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)

Ant*_*ams 5

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().