linux条件变量

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;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值