分类: LINUX
2013-06-05 14:46:23
原文地址:(4)条件变量 作者:g_programming
条件变量
定义: pthread_cond_t
初始化:PTHREAD_COND_INITIALIZER //只限于使用在静态分配条件变量
1. pthread_cond_init() 但要调用 pthread_mutex_destroy 释放
#include
2. int pthread_cond_init(pthread_cond_t *restrict cond,pthread_condattr_t *restrict attr);
3. int pthread_cond_destroy(pthread_cond_t *cond);
Both return: 0 if OK, error number on failure
等待条件为真:
#include
4. int pthread_cond_wait(pthread_cond_t *restrict cond,pthread_mutex_t *restrict mutex);
5. int pthread_cond_timedwait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex,
const struct timespec *restrict timeout);
返回值:成功返回0, 否则返回错误编号
第一个函数,先lock,接着等待条件,然后unlock。
第二个函数,多了时间限制,如果超过时限后条件还没发生,函数将再次请求mutex,并且然后ETIMEDOUT错误.
时间限制使用下面这个结构体:
struct timespec {
time_t tv_sec; /* seconds */
long tv_nsec; /* nanoseconds */十亿分之一秒,毫微秒
};
时间限制是绝对值,所以要把相对时间转为绝对时间:
void maketimeout(struct timespec *tsp, long minutes)
{
struct timeval now;
gettimeofday(&now);/*取得当前时间*/
tsp->tv_sec = now.tv_sec;
tsp->tv_nsec = now.tv_usec * 1000; /* usec to nsec */
tsp->tv_sec += minutes * 60;
}
当条件满足时,使用下面两个函数之一来唤醒线程
#include
6. int pthread_cond_signal(pthread_cond_t *cond); //唤醒等待该条件的某个线程
7. int pthread_cond_broadcast(pthread_cond_t *cond); //唤醒等待该条件的所以线程
Both return: 0 if OK, error number on failure
********************************************************************
举例说明线程中的条件变量的使用
*********************************************************************
#include
#include
#include
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
int i=1;
void *thread1(void *junk)
{
for(i=1;i<=9;i++)
{
pthread_mutex_lock(&mutex);
if(i%3==0)
pthread_cond_signal(&cond);
else
printf("thead1:%d\n",i);
pthread_mutex_unlock(&mutex);
sleep(1);
}
}
void *thread2(void *junk)
{
while(i<=9)
{
pthread_mutex_lock(&mutex);
if(i%3!=0)
pthread_cond_wait(&cond,&mutex);
printf("thread2:%d\n",i);
pthread_mutex_unlock(&mutex);
sleep(1);
}
}
int main(void)
{
pthread_t t_a;
pthread_t t_b;
pthread_create(&t_a,NULL,thread2,(void *)NULL);
pthread_create(&t_b,NULL,thread1,(void *)NULL);
pthread_join(t_b, NULL);
pthread_mutex_destroy(&mutex);
pthread_cond_destroy(&cond);
exit(0);
}
结果:
thead1:1
thead1:2
thread2:3
thead1:4
thead1:5
thread2:6
thead1:7
thead1:8
thread2:9
*********************************************************************