线程同步(多线程协同使用有限资源)
来源:互联网 发布:win域名退出中国 编辑:程序博客网 时间:2024/05/21 06:23
1)互斥量(mutex)
全局变量:pthread_mutex_t m;//定义互斥量
主函数: pthread_mutex_init(&m,NULL);//初始化
……操作…… //默认配置NULL
pthread_mutex_destory(&m);//注销
线程函数:
pthread_mutex_lock(&m);//加锁
pthread_mutex_unlock(&m);//解锁
2)信号量(semphore):一个特殊的整形变量,支持P V操作,如果信号量的当前值为0,P操作会阻塞当前线程的执行
全局变量:sem_t s;//定义信号量
主函数:int sem_init(sem_t *sem, int pshared, unsigned int value);//初始化
//0表可在不同进程间共享//n个厕所
int sem_destroy(sem_t *sem);//注销
线程函数:
sem_wait(&m); //P操作,信号量加1,如果已经为0依然操作,会阻塞线程,直到不为0
sem_post(&m); //V操作,信号量减1
实现代码:
#include <stdio.h>#include <stdlib.h>#include <pthread.h>#include <stdlib.h>#include <semaphore.h>#define N 5 //加了关键字,操作系统不会把它调到寄存器中,一直在内存中volatile int empty_flag=2;//被频繁的访问的量,系统会自动调到寄存器中用pthread_mutex_t m;//互斥量sem_t n;void* ptr_fun(void* arg);int main() {// pthread_mutex_init(&m,NULL);//互斥量初始化 sem_init(&n,0,2);//信号量初始化 pthread_t tid[N]; int i; for(i=0;i<N;i++) { if(pthread_create(&tid[i],NULL,ptr_fun,(void*)i)!=0) { perror("pthread_create"); } } for(i=0;i<N;i++) { pthread_join(tid[i],NULL); }// pthread_mutex_destroy(&m);//注销互斥量 sem_destroy(&n); return 0;}/*******5个人五个厕所void* ptr_fun(void* arg){ int p; p=(int)arg; srand(time(NULL)); int t; t=rand()%5+1; printf("%d号进入厕所......\n",p); sleep(t); printf("%d号结束~\n",p);}*///5个人两个厕所void* ptr_fun(void* arg){ int p; p=(int)arg; srand(time(NULL)); int t; t=rand()%5+1;/* while(empty_flag==0);//没有厕所一直阻塞 empty_flag--;//一有厕所就占着//必须保证这两句同时进行,否则发生错误 pthread_mutex_lock(&m);//加锁//1个一个进厕所*/ sem_wait(&n);//p操作 printf("%d号进入厕所......\n",p); sleep(t);// empty_flag++;// pthread_mutex_unlock(&m); sem_post(&n); printf("%d号结束~\n",p);}
阅读全文
0 0
- 线程同步(多线程协同使用有限资源)
- Windows多线程总结(3)-- 线程同步(使用互斥对象实现线程同步)
- 多线程编程指南摘录:线程同步---使用锁(2)
- 多线程(2)- 线程同步
- 多线程(二)--线程同步
- 多线程同步(线程安全,同步方法)
- C++——多线程编程(二)std::mutex 线程同步、解决资源竞争问题
- python多线程编程: 使用互斥锁同步线程
- 多线程编程(3): 使用互斥锁同步线程
- python多线程编程: 使用互斥锁同步线程
- python多线程编程: 使用互斥锁同步线程
- python多线程编程: 使用互斥锁同步线程
- Python多线程使用及线程同步
- python多线程编程: 使用互斥锁同步线程
- Java:多线程,线程同步,同步锁(Lock)的使用(ReentrantLock、ReentrantReadWriteLock)
- 银行取款[多线程]{使用同步方法确保线程同步}
- 银行取款[多线程]{使用同步代码块确保线程同步}
- java线程 之 资源同步(1)
- svn分支、主干合并
- HDU 1760 A New Tetris Game
- 深入理解 ruby 中的 eval 与 binding
- 获取多个随机生成的不重复的6位数,不重复的6位数或8位数串
- loj6002网络流 24 题 最小路径覆盖 最大流
- 线程同步(多线程协同使用有限资源)
- iOS 使用ProtocolBuffer 时报 Protocol message end-group tag did not match expected tag.
- JDK+Tomcat搭建JSP运行环境--JSP基础
- 010-logback中过滤器filter
- Kafka日志存储系统和offset查找逻辑
- Vuejs computed get set 计算属性
- 自己动手从0到1写嵌入式操作系统
- QT开发(三十九)——GraphicsView框架
- Java内部类详解