pthread_cond_wait() 用于阻塞当前线程,等待别的线程使用pthread_cond_signal()或pthread_cond_broadcast来唤醒它。 pthread_cond_wait() 必须与pthread_mutex 配套使用。pthread_cond_wait()函数一进入wait状态就会自动release mutex。当其他线程通过pthread_cond_signal()或pthread_cond_broadcast,把该线程唤醒,使pthread_cond_wait()通过(返回)时,该线程又自动获得该mutex。
pthread_cond_signal函数的作用是发送一个信号给另外一个正在处于阻塞等待状态的线程,使其脱离阻塞状态,继续执行.如果没有线程处在阻塞等待状态,pthread_cond_signal也会成功返回。
使用pthread_cond_signal一般不会有“惊群现象”产生,他最多只给一个线程发信号。假如有多个线程正在阻塞等待着这个条件变量的话,那么是根据各等待线程优先级的高低确定哪个线程接收到信号开始继续执行。如果各线程优先级相同,则根据等待时间的长短来确定哪个线程获得信号。但无论如何一个pthread_cond_signal调用最多发信一次。
#include <pthread.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
static pthread_mutex_t mutex;
static pthread_cond_t cond;
static int flag = 0;
void *mythread(void *param)
{
while(1)
{
if(flag == 1)
{
pthread_mutex_lock(&mutex);
printf("mythread is cond_wait\n");
pthread_cond_wait(&cond,&mutex);
flag = 0;
pthread_mutex_unlock(&mutex);
}
printf("mythread is run\n");
}
}
int main(void)
{
pthread_t tid;
pthread_mutex_init(&mutex,NULL);
pthread_cond_init(&cond,NULL);
pthread_create(&tid,NULL,mythread,NULL);
while(1)
{
pthread_mutex_lock(&mutex);
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mutex);
printf("mythread is signal\n");
sleep(5);
flag = 1;//阻塞
printf("mythread is sleep\n");
sleep(5);
}
pthread_mutex_destroy(&mutex);
pthread_cond_destroy(&cond);
pthread_cancel(tid);
pthread_join(tid, NULL);
return 0;
}