进程线程-------条件变量

条件变量

​应用场景:生产者消费者问题

​必要性:为了实现等待某个资源,让线程休眠。提高运行效率.

​使用步骤

1.

​ pthread_cont_t cond = PTHREAD_COND_INITIALIZER; //初始化条件变量                                     pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; //初始化互斥量

2.​生产资源线程:

​pthread_mutex_lock(&mutex); //开始生产资源

​pthread_cond_sigal(&cond); //通知一个消费线程或者 

pthread_cond_broadcast(&cond);//广播通知多个消费线程

​pthread_mutex_unlock(&mutex);

3.消费者线程:

​pthread_mutex_lock(&mutex);

​while(如果没有资源){

//防止惊群效应       

pthread_cond_wait(&cond,&mutex);

    }

有了资源消费资源   pthread_mutex_unlock(&mutex);

​注意:

1.​pthread_cond_wait(&cond,&mutex),在没有资源等待是先ulock休眠,等资源到了,在lock,所以pthread_cond_wait 和 pthread_mutex_lock必须配对使用。

2.如果pthread_cond_signal或者pthread_cond_broadcast早于pthread_cond_wait,则有可能丢失信号。

3.​pthread_cond_signal信号会被多个线程收到,这就是线程的惊群效应。所以加上判断条件while循环。

条件变量:

#include <pthread.h>
#include <unistd.h>
#include <stdio.h>


pthread_cond_t  hasTaxi=PTHREAD_COND_INITALZER;
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;

struct taxi{
   struct *next;
   int num;

};


void *taxiarv(void *arg)
{
     printf(""taxi arrived thread\n);
     pthread_detach(pthread_self( ));
     struct taxi *tx;
     int i = 1 ;
     while(1){
        tx = malloc(sizeof(struct taxi)) ;
        tx->num = i++;
        printf("" taxi %d comming\n,i);
         pthread_mutex_lock(&lock);
         tx->next = Head;
         Head = tx;
         pthread_cond_signal(&hasTaxi);
           
        pthread_mutex_unlock(&lock);

     }


     pthread_exit(0);


}
void *takeTaxi(void *arg)
{
      printf("take  arrived  thread\n");
      pthread_detach(pthread_self( ));
      struct taxi *tx;
      while(1){
       pthread_mutex_lock(&lock); 
       while(Head == NULL)
       {
            pthread_cond_wait(&hadTaxi,&lock);
       }
    }
       tx = Head;
       Head = tx->next;
       printf("take taxi %d\n",tx->num);

       pthread_mutex_unlock(&lock);


}

int main(){
   pthread_t tid1,tid2;
   pthread_create(&tid,NULL,taxiarv,NULL);
   sleep(5);
   pthread_create(&tid,NULL,takeTaxi,NULL);
   while(1){
    sleep(1);
     }

}

  • 10
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值