1

在 pthread 等待之前,我们使用互斥锁进行锁定,这样其他代码可能不会尝试更改条件变量。wait 然后解锁互斥锁并等待信号。

说,在其他一些线程中,我锁定了同一个互斥锁,之后,我使用了“信号”。然后解锁线程。当信号完成时,等待线程唤醒并再次获取互斥锁。

Thread1                   Thread2
{                         {
    lock(mutex);               lock(mutex);
    wait(mutex);               signal(mutex);
    unlock(mutex);             unlock(mutex);
}                          }

假设三个线程一语句包含在 while(1) 循环中。然后假设 thread2 锁定互斥体,向它发出信号,然后解锁互斥体。然后没有结束,而是进入睡眠状态。

那么条件变量的值会永久改变吗?如果线程一的三个语句在无限循环中运行,它会不会永远等待,只是发现信号已经发出?当等待调用返回时,它是否将条件变量的值设置回初始值?

如果是,我可以对变量使用创建、销毁或初始化方法来设置值吗?如果是,如何?这些函数具体是做什么的?

谢谢,

4

1 回答 1

1

pthread_cond_signal()将始终唤醒至少一个当前正在等待该条件变量的线程pthread_cond_wait()。如果同一线程或不同线程再次调用pthread_cond_wait(),它将阻塞并等待另一个信号。

这意味着 pthread 条件变量必须始终与某种共享数据配对,受调用时持有的互斥锁保护pthread_cond_wait()。在调用之前pthread_cond_wait(),线程必须检查共享数据以查看它想要等待的条件是否已经发生——如果没有,它不应该等待。

此类共享数据的最简单示例可能是全局标志。在您的示例中:

int flag = 0;

Thread 1 {
    pthread_mutex_lock(&mutex);
    while (!flag)
        pthread_cond_wait(&cond, &mutex);
    pthread_mutex_unlock(&mutex);
}

Thread 2 {
    pthread_mutex_lock(&mutex);
    flag = 1;
    pthread_mutex_signal(&cond);
    pthread_mutex_unlock(&mutex);
}

您可以在这里看到,当条件为“重置”时完全在您的控制之下——例如,您可以Thread 1flag = 0;它调用pthread_mutex_unlock().

共享状态通常比一个简单的标志更复杂 - 例如,您可能有一个生产者线程调用pthread_mutex_wait(),而共享缓冲区中没有空间。

于 2012-07-30T05:52:16.570 回答