pthreads等待和信号怀疑linux

时间:2012-07-27 06:30:23

标签: pthreads signals wait

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

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

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

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

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

如果是,我可以对变量使用create,destroy或initialize方法来设置值吗?如果有,怎么样?这些功能到底是做什么的?

谢谢,

1 个答案:

答案 0 :(得分:0)

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 1设置flag = 0;,然后才能调用pthread_mutex_unlock()

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