青岛城阳网站制作,关于建设网站的经费请示,网站 内页,校园网站建设的可行性分析概述
条件变量的作用#xff1a;
条件变量和互斥量配合使用#xff0c;主要应用于生产者和消费者问题。
这种问题也是一种临界资源的问题#xff0c;但与互斥量一文中 写文件 这种资源不同。文件是一直存在的临界资源#xff0c;而生产者的资源不是一直存在…概述
条件变量的作用
条件变量和互斥量配合使用主要应用于生产者和消费者问题。
这种问题也是一种临界资源的问题但与互斥量一文中 写文件 这种资源不同。文件是一直存在的临界资源而生产者的资源不是一直存在资源的产生需要一些条件。条件变量实现了在等待生产者时消费者进入休眠状态提高运行效率。
条件变量使用方法
1、初始化互斥量、条件变量
2.1 生产者加锁互斥量-生产资源-发送信号给条件变量-解锁互斥量
2.2 消费者加锁互斥量-无资源时等待条件变量-消费资源-解锁互斥量
相关函数
1、初始化
//动态初始化
int pthread_cond_init(pthread_cond_t *restrict cond,const pthread_condattr_t *restrict attr);
//静态初始化
pthread_cond_t cond PTHREAD_COND_INITIALIZER;
返回值成功返回0失败返回错误码
cond要初始化的条件变量
attr条件变量属性NULL代表默认属性
2、销毁
int pthread_cond_destroy(pthread_cond_t *cond);
返回值成功返回0失败返回错误码
cond要销毁的条件变量
3、等待资源
//等待临界资源,阻塞
int pthread_cond_wait(pthread_cond_t *restrict cond,pthread_mutex_t *restrict mutex);
//等待临界资源,一段时间后退出阻塞
int pthread_cond_timedwait(pthread_cond_t *restrict cond,pthread_mutex_t *restrict mutex,const struct timespec *restrict abstime);
cond等待哪一个条件变量的信号
mutex与条件变量搭配使用的互斥量
注意该函数在没有资源时会解锁互斥量并把本线程休眠。当接收到资源时会解除休眠并再次把互斥量上锁
4、发送信号
//单个发送信号,代表资源来了,所有线程竞争该资源
int pthread_cond_signal(pthread_cond_t *cond);
//广播发送信号,代表资源来了
int pthread_cond_broadcast(pthread_cond_t *cond);cond要向哪一个条件变量发送信号
注意当 发送信号 比 等待资源 早时等待资源 是接收不到信号的这会导致信号丢失。这意味着当运行到 等待资源 时会进入阻塞直到第二次 发送信号 到来
生产者消费者示例代码
#include unistd.h
#include stdio.h
#include errno.h
#include pthread.h
#include stdlib.h
pthread_mutex_t mutex;//互斥锁
pthread_cond_t cond;//条件变量
//资源
struct resource{char num;struct resource* pNext;
};
struct resource Head;
struct resource* pTail;
//消费者
void* consumer(void* arg){struct resource* pResource NULL;while(1){//1.加锁互斥量pthread_mutex_lock(mutex);//2.无资源时等待条件变量,有资源时不断消耗资源while(Head.pNext NULL){//while的作用:防止信号为广播时产生惊群效应pthread_cond_wait(cond,mutex);}//3.消费资源pResource Head.pNext;Head.pNext Head.pNext-pNext;if(Head.pNext NULL){pTail Head;}printf(consumer:num %d\n,pResource-num);free(pResource);//4.解锁互斥量pthread_mutex_unlock(mutex);sleep(1);}
}
//生产者
void* producer(void* arg){struct resource* pNew NULL;int i 0;while(1){//1.加锁互斥量pthread_mutex_lock(mutex);//2.生产资源if((pNew malloc(sizeof(struct resource))) NULL){printf(malloc err\n);pthread_exit(NULL);}pNew-num i;pNew-pNext NULL;pTail-pNext pNew;pTail pNew;printf(producer:num %d\n,pNew-num);//3.发送信号给条件变量pthread_cond_signal(cond);//4.解锁互斥量pthread_mutex_unlock(mutex);sleep(1);}
}
int main(){pthread_t tid;Head.pNext NULL;pTail Head;//初始化互斥锁和条件变量pthread_mutex_init(mutex,NULL);pthread_cond_init(cond,NULL);//创建线程if(pthread_create(tid,NULL,producer,NULL) ! 0){perror(pthread_create);pthread_detach(tid);return -1;}if(pthread_create(tid,NULL,consumer,NULL) ! 0){perror(pthread_create);return -1;}while(1);//销毁互斥锁和条件变量pthread_mutex_destroy(mutex);pthread_cond_destroy(cond);return 0;
}