POSIX条件变量
来源:互联网 发布:生物计算机 知乎 编辑:程序博客网 时间:2024/05/27 20:37
条件变量:
1.当一个线程互斥地访问某个变量时,他可能发现其他线程改变状态之前,他什么也不做了
2.例如:一个线程访问队列时,发现队列为空,他只能等待,只到其他线程将一个节点添加到队列中,这种情况就需要用到条件变量
对于解决无界缓冲区比较好的选择
函数:
pthread_cond_init初始化一个条件变量
pthread_cond_destroy 销毁一个条件变量
pthread_cond_wait在一个条件上等待做三件事:1,对mutex进行解锁,2,等待条件,直到有线程向他发起通知 3,,重新对mutex进行加锁操作
pthread_cond_signal当一个条件满足时向一个线程发送信号,如果没有任何一个线程处于等待线程条件的状态,这个信号将会被忽略
pthread_cond_broadcast向等待的所有等待的线程发送通知
条件变量的使用规范:
等待条件代码
pthread_mutex_lock(&mutex)
while(条件为假)//用while的原因:因为pthread_cond_wait会 被虚假唤醒,然而条件变量却没有改变,所以用while可以再次判定条件变量(另外他会自动重启与while无关)
pthread_cond_wait(cond,mutex);
修改条件
pthread_mutex_unlock(&mutex)
给条件发送信号代码
pthread_mutex_lock(&mutex)
设置条件为真
pthread_cond_signal(cond);
pthread_mutex_unlock(&mutex);
#include <unistd.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <stdlib.h>#include <stdio.h>#include <errno.h>#include <string.h>#include <pthread.h>#define ERR_EXIT(m)\do \{ \perror(m); \exit(EXIT_FAILURE); \}while(0)#define CONSUMERS_COUNT 2#define PRODUCERS_COUNT 1pthread_mutex_t g_mutex;pthread_cond_t g_cont;int iread;pthread_t g_thread[CONSUMERS_COUNT+PRODUCERS_COUNT];void* produce(void* arg){while(1){pthread_mutex_lock(&g_mutex);iread++;printf("product iread=%d\n",iread);pthread_cond_signal(&g_cont);printf("produce is produat\n");pthread_mutex_unlock(&g_mutex);sleep(3);}return NULL;}void* consumer(void* arg){while(1){pthread_mutex_lock(&g_mutex);printf("consumer iread =%d\n",iread);while(iread==0){pthread_cond_wait(&g_cont, &g_mutex);printf("iread is changed\n");}iread--;sleep(1);pthread_mutex_unlock(&g_mutex);}return NULL;}int main(){int i;pthread_mutex_init(&g_mutex,NULL);pthread_cond_init(&g_cont,NULL);for(i=0; i< PRODUCERS_COUNT;i++){pthread_create(&g_thread[i],NULL,produce,(void*)i);}for(i=0; i< CONSUMERS_COUNT;i++){pthread_create(&g_thread[i+ PRODUCERS_COUNT],NULL,consumer,(void*)i);}for(i=0; i< PRODUCERS_COUNT+CONSUMERS_COUNT;i++){pthread_join(g_thread[i],NULL);}pthread_mutex_destroy(&g_mutex);pthread_cond_destroy(&g_cont);return 0;}
0 0
- POSIX线程:条件变量
- posix 条件变量
- Posix多线程-条件变量
- POSIX线程:条件变量
- POSIX多线程--条件变量
- Posix条件变量
- POSIX条件变量
- POSIX多线程--条件变量
- POSIX条件变量
- POSIX条件变量
- POSIX 条件变量
- POSIX 条件变量
- POSIX 条件变量详细解析
- POSIX 条件变量详细解析
- 正确使用POSIX条件变量
- posix 多线程程序使用条件变量
- linux Posix线程同步(条件变量) 实例
- posix多线程编程之条件变量
- web开发基本流程
- Linux内核层虚拟地址和物理地址转换函数
- java File的抽象路径名、相对路径、绝对路径
- 选择排序之简单选择排序(java实现)
- 20160307 Single Number
- POSIX条件变量
- 在java静态方法中获取当前类名
- 优先队列
- 283. Move Zeroes
- 课堂作业1
- 网站的简单的母版页
- ReversedDemo
- Linux下如何模拟按键输入和模拟鼠标
- Android照片墙应用实现,再多的图片也不怕崩溃