Linux条件变量
条件变量
条件变量是利用线程间共享是全局变量进行同步的一种机制。条件变量宏观上类似if语句,符合条件就能执行某段程序,否则只能等待条件成立。
一、函数
pthread_cond_init函数:初始化条件变量
pthread_cond_wait函数:基于条件变量阻塞,无条件等待
pthread_cond_timedwait函数:阻塞直到指定事件发生,计时等待
pthread_cond_signal函数:解除特定线程的阻塞,存在多个等待线程时按入队顺序激活其中一个
pthread_cond_broadcast函数:解除所有线程的阻塞
pthread_cond_destroy函数:清楚条件变量
二、条件变量初始化:
pthread_cond_t cond =PTHREAD_COND_INITIALIZER
int pthread_cond_int(pthread_cond_t *cond,pthread_condattr_t *cond_attr);
cond_attr参数是条件变量的属性,由于其并没有得到实现,所以它的值通常是NULL
三、等待条件成立的两个函数
int pthread_cond_wait(pthread_cond_t *cond,pthread_mutex_t *mutex);
int pthread_cond_timedwait(pthread_cond_t*cond, pthread_mutex_t *mutex, const struct timespec *abstime);
pthread_cond_wait函数释放由mutex指向的互斥锁,同时使当前线程关于cond指向的条件变量阻塞,直到条件被信号唤醒。
如果条件表达式为假,那么线程基于条件变量阻塞。当一个线程改变条件变量时,条件变量获得一个信号,使得等待条件的线程退出阻塞状态。
pthread_cond_timedwait函数将阻塞直到条件变量获得信号或者经过由abstime指定的时间。也就是说,如果在给定时间前条件没有满足,则返回ETIMEOUT,结束等待。
四、激活条件变量
int pthread_cond_signal(pthread_cond_t*cond);
int pthread_cond_broadcast(pthread_cond_t*cond);
pthread_cond_signal按顺序激活等待的线程,pthread_cond_broadcast激活所有等待的线程。
五、清除
int pthread_cond_destroy(pthread_cond_t*cond);
六、代码
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
pthread_cond_t threadCond;
pthread_mutex_t threadMutex;
void* threadOne(void *arg)
{
//pthread_mutex_lock(&threadMutex);
while(1)
{
pthread_cond_wait(&threadCond,&threadMutex);
printf("getthread cond sig!\n");
}
//pthread_mutex_unlock(&threadMutex);
}
int main(int argc, char **argv)
{
if(argc != 1)
{
printf("Usage:\n");
printf("threadcond\n");
return1;
}
pthread_cond_init(&threadCond,NULL);
pthread_mutex_init(&threadMutex,NULL);
pthread_tthreadId;
if(pthread_create(&threadId,NULL, threadOne, NULL) != 0)
{
printf("threadcreate error! \n");
return1;
}
usleep(5000000);
pthread_cond_signal(&threadCond);
usleep(5000);
pthread_cond_signal(&threadCond);
usleep(5000);
pthread_cond_signal(&threadCond);
usleep(5000000);
pthread_cond_destroy(&threadCond);
pthread_mutex_destroy(&threadMutex);
return0;
}