条件变量(cond)
条件变量特别适用于多个线程等待某个条件的发生。如果不使用条件变量,那么每个线程就需要不断尝试获得互斥锁并检查条件是否发生,这样大大浪费了系统的资源。
初始化条件变量
静态态初始化
pthread\_cond\_t cond = PTHREAD\_COND\_INITIALIER;
动态初始化
int pthread\_cond\_init(pthread\_cond\_t *cond, pthread\_condattr\_t *cond\_attr);
等待条件成立
释放锁,同时阻塞等待条件变量为真才行。timewait()设置等待时间,仍未signal,返回ETIMEOUT(加锁保证只有一个线程wait)
int pthread\_cond\_wait(pthread\_cond\_t *cond, pthread\_mutex\_t *mutex);
int pthread\_cond\_timewait(pthread\_cond\_t *cond,pthread\_mutex *mutex,const timespec *abstime);
激活条件变量
pthread\_cond\_signal,pthread\_cond\_broadcast(激活所有等待线程)
int pthread\_cond\_signal(pthread\_cond\_t *cond);
int pthread\_cond\_broadcast(pthread\_cond\_t *cond); //解除所有线程的阻塞
清除条件变量
无线程等待,否则返回EBUSY
int pthread\_cond\_destroy(pthread\_cond\_t *cond);
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
pthread_mutex_t mutex;
pthread_cond_t cond;
void hander(void *arg)
{
free(arg);
(void)pthread_mutex_unlock(&mutex);
}
void *thread1(void *arg)
{
pthread_cleanup_push(hander, &mutex);
while(1)
{
printf("thread1 is running\n");
pthread_mutex_lock(&mutex);
pthread_cond_wait(&cond, &mutex);
printf("thread1 applied the condition\n");
pthread_mutex_unlock(&mutex);
sleep(4);
}
pthread_cleanup_pop(0);
}
void *thread2(void *arg)
{
while(1)
{
printf("thread2 is running\n");
pthread_mutex_lock(&mutex);
pthread_cond_wait(&cond, &mutex);
printf("thread2 applied the condition\n");
pthread_mutex_unlock(&mutex);
sleep(1);
}
}
int main()
{
pthread_t thid1,thid2;
printf("condition variable study!\n");
pthread_mutex_init(&mutex, NULL);
pthread_cond_init(&cond, NULL);
pthread_create(&thid1, NULL, thread1, NULL);
pthread_create(&thid2, NULL, thread2, NULL);
sleep(1);
do
{
pthread_cond_signal(&cond);
}while(1);
sleep(20);
pthread_exit(0);
return 0;
}