pthread_cond_signal——唤醒睡眠的线程,一次只能唤醒一个线程
pthread_cond_broadcast——唤醒睡眠的线程,一次唤醒所有睡眠的线程
demon1——pthread_cond_signal
#include <stdio.h>
#include <pthread.h>
static pthread_t thread1;
static pthread_t thread2;
//静态初始化
static pthread_mutex_t lock=PTHREAD_MUTEX_INITIALIZER;
static pthread_cond_t cond=PTHREAD_COND_INITIALIZER;
void *function1()
{
while(1)
{
pthread_mutex_lock(&lock);
printf("===== 线程1进入睡眠 ====\n");
pthread_cond_wait(&cond,&lock);
printf("==== 线程1 唤醒 ====\n");
pthread_mutex_unlock(&lock);
}
}
void *function2()
{
while(1)
{
pthread_mutex_lock(&lock);
printf("===== 线程2进入睡眠 ====\n");
pthread_cond_wait(&cond,&lock);
printf("==== 线程2 唤醒 ====\n");
pthread_mutex_unlock(&lock);
}
}
int main()
{
int i=0;
if(-1==pthread_create(&thread1,NULL,function1,NULL))
{
printf("thread_create1 fail!\n");
pthread_detach(thread1);
}
if(-1==pthread_create(&thread2,NULL,function2,NULL))
{
printf("thread_create fail!\n");
pthread_detach(thread1);
}
while(1)
{
sleep(2);
i++;
printf("\n 第%d次唤醒\n",i);
pthread_mutex_lock(&lock);
if(-1==pthread_cond_signal(&cond))
{
printf("pthread_cond_broadcast error!\n");
}
pthread_mutex_unlock(&lock);
}
return 0;
}
运行结果:
demon2——pthread_cond_broadcast
#include <stdio.h>
#include <pthread.h>
static pthread_t thread1;
static pthread_t thread2;
//静态初始化
static pthread_mutex_t lock=PTHREAD_MUTEX_INITIALIZER;
static pthread_cond_t cond=PTHREAD_COND_INITIALIZER;
void *function1()
{
while(1)
{
pthread_mutex_lock(&lock);
printf("===== 线程1进入睡眠 ====\n");
pthread_cond_wait(&cond,&lock);
printf("==== 线程1 唤醒 ====\n");
pthread_mutex_unlock(&lock);
}
}
void *function2()
{
while(1)
{
pthread_mutex_lock(&lock);
printf("===== 线程2进入睡眠 ====\n");
pthread_cond_wait(&cond,&lock);
printf("==== 线程2 唤醒 ====\n");
pthread_mutex_unlock(&lock);
}
}
int main()
{
int i=0;
if(-1==pthread_create(&thread1,NULL,function1,NULL))
{
printf("thread_create1 fail!\n");
pthread_detach(thread1);
}
if(-1==pthread_create(&thread2,NULL,function2,NULL))
{
printf("thread_create fail!\n");
pthread_detach(thread1);
}
while(1)
{
sleep(2);
i++;
printf("\n 第%d次唤醒\n",i);
pthread_mutex_lock(&lock);
if(-1==pthread_cond_broadcast(&cond))
{
printf("pthread_cond_broadcast error!\n");
}
pthread_mutex_unlock(&lock);
}
return 0;
}
运行结果:
对比运行结果,清楚的可以发现pthread_cond_broadcast可以唤醒所有睡眠的线程