(1) pthread_cond_timedwait()
简短(浅薄)的解释它是如何工作的。
1) 与 pthread_cond_timewait() 关联的互斥锁应在调用该函数之前锁定。这是你的责任。否则,函数行为是未定义的。
2) 当您的程序将其控制权转移给该函数时,该函数会自动释放关联的互斥体,从而使其他线程有机会获取它。当您等待时,互斥体被解锁。解锁它是函数的责任。
如果函数实现无法做到这一点,则只有一个线程将处理关联的互斥体。
3) 当函数返回时,无论是由于超时还是由于接收到信号,函数都会自动锁定互斥体。锁定互斥锁是该函数的职责。
4) 现在您应该再次解锁互斥锁。
解释中的“原子”一词意味着函数本身是线程安全的。
(2) pthread_cond_broadcast()
使用 pthread_cond_broadcast() 发出信号会导致所有等待线程唤醒并开始一一处理。使用 pthread_cond_signal() 发出信号只会唤醒一个线程。要“感受”这个概念,您可以使用以下说明该想法的代码。将 pthread_cons_signal 替换为 pthread_cond_brodcast。请考虑到,使用 pthread_cons_signal 时程序永远不会终止:只有一个等待线程获取信号并从等待循环中退出。
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
int value = 0;
void* waiter(void* arg)
{
int* tid = (int*)arg;
printf("waiter started %d\n", *tid);
pthread_mutex_lock(&mutex);
while(value == 0)
{
pthread_cond_wait(&cond, &mutex);
}
sleep(10);
printf("waiter %d releases\n", *tid);
pthread_mutex_unlock(&mutex);
}
void* notifier(void* arg)
{
sleep(2);
pthread_mutex_lock(&mutex);
value = 1;
//pthread_cond_broadcast(&cond);
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mutex);
}
int main(void)
{
pthread_t w1; // waiter
int tid1=1;
pthread_t w2; // waiter
int tid2=2;
pthread_t n1; // notifier
pthread_create(&w1, NULL, waiter, &tid1);
pthread_create(&w2, NULL, waiter, &tid2);
pthread_create(&n1, NULL, notifier, NULL);
pthread_join(w1, NULL);
pthread_join(w2, NULL);
pthread_join(n1, NULL);
return 0;
}