【C语言】【unix c】线程同步,条件变量,mutex锁,信号量
来源:互联网 发布:淘宝金牌店铺联盟 编辑:程序博客网 时间:2024/06/04 19:19
五、线程同步,条件变量,mutex锁,信号量 新建的进程和进程中已经存在的进程是异步的 这些线程会对公共资源竞争。 怎样解决竞争? 1、可重入函数 2、让将异步的线程同步的共享资源 举例:多个线程资源竞争演示(count.c) #include <stdio.h> #include <pthread.h> int count = 1;//在数据段共享资源,多个进程抢资源,这里是临界资源 void *doit() { int i; int val; for(i = 0; i < 5; i++) { val = count; printf("val=%d\n",val++); printf("tid:%lu\n",pthread_self()); count = val; } return NULL; } int main(void) { pthread_t tid1, tid2; //创建两个线程 pthread_create(&tid1,NULL,doit,NULL); pthread_create(&tid2,NULL,doit,NULL); //等待线程汇合 pthread_join(tid1,NULL); pthread_join(tid2,NULL); return 0; } 结果为:5000-10000不定 mutex锁: mutex是一个互斥的设备 mutex类型的变量有两种状态:unlocked(不被任何线程拥有),locked(被一个线程拥有) 一个mutex从来不能被两个线程同时拥有 如果一个线程想拥有的mutex锁被另外的线程占用,那么这个线程挂起执行,知道另外线程放弃才能得到 对临界资源的访问要遵守三步: 1、先获取mutex锁 2、访问临界资源 3、释放mutex锁 mutex锁解决临界问题: pthread_mutex_init(3) 静态初始化一个mutex锁: pthread_mutex_t fastmutex = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_t:是一个类型,mutex锁的类型 int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr); 功能:初始化一个mutex 参数: mutex:指定要初始化的mutex锁 *mutexattr:NULL 返回值: 0 int pthread_mutex_lock(pthread_mutex_t *mutex); 功能:获取mutex锁,如果这个锁不被其他线程占有,立即返回,拥有了这吧锁,将锁的状态改变为locked 这把锁已经被其他线程占用,则挂起线程,直到其他线程解锁为止。 参数: mutex:指定了要获取的mutex锁 返回值:非零 错误 0 成功 int pthread_mutex_trylock(pthread_mutex_t *mutex); 功能:获取mutex锁,在其他线程占有的时候,非阻塞,立即返回,错误,EBUSY 参数: mutex:指定要获取的mutex锁 返回值:非零 错误 0 成功 int pthread_mutex_unlock(pthread_mutex_t *mutex); 功能:解锁mutex锁 参数: mutex:要释放的mutex锁 返回值:非零 错误 0 成功 int pthread_mutex_destroy(pthread_mutex_t *mutex); 功能:销毁一个mutex锁 参数: mutex:指定要销毁的mutex锁 返回值:非零 错误 0 成功 改进count.c 使用mutex锁让进程同步访问临界资源 #include <stdio.h> #include <pthread.h> int count = 1;//在数据段共享资源,多个进程抢资源,这里是临界资源 //定义一个mutex锁,定义一个锁应该在全局变量 pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; void *doit() { int i; int val; for(i = 0; i < 5; i++) { //在此加锁 pthread_mutex_lock(&mutex); val = count; printf("val=%d\n",val++); printf("tid:%lu\n",pthread_self()); count = val; //解锁,在for里面可以交替执行,在for外的话只能等for执行完才能执行了 pthread_mutex_unlock(&mutex); } return NULL; } int main(void) { pthread_t tid1, tid2; //创建两个线程 pthread_create(&tid1,NULL,doit,NULL); pthread_create(&tid2,NULL,doit,NULL); //等待线程汇合 pthread_join(tid1,NULL); pthread_join(tid2,NULL); //销毁mutex锁 pthread_mutex_destroy(&mutex); return 0; }
阅读全文
0 0
- 【C语言】【unix c】线程同步,条件变量,mutex锁,信号量
- 【C语言】【unix c】条件变量线程同步
- Linux线程池(C语言描述) - 互斥量+条件变量同步
- Linux线程池(C语言描述) - 互斥量+条件变量同步
- 线程同步的方式——Mutex(互斥量)、 Condition variable(条件变量)和Semaphore(信号量)
- 线程同步之信号量,代码实现方法2(条件变量+mutex互斥量)
- 线程同步之mutex和条件变量
- 【C语言】【unix c】信号量
- 线程同步机制:互斥量、信号量、读写锁、条件变量
- 线程同步(互斥锁、读写锁、条件变量、信号量)
- 线程同步(信号量,互斥,条件变量)
- 线程间同步--互斥锁、条件变量、信号量
- 线程间同步--互斥锁、条件变量、信号量
- 线程同步—条件变量和信号量
- Linux C 信号、线程同步、线程互斥锁、线程条件变量
- 线程同步-条件变量-unix网络编程
- 【C语言】【unix c】为什么要线程同步
- 线程同步:原子操作、锁、二元信号量、信号量、互斥量、临界区、读写锁、条件变量等
- 【C语言】【unix c】线程的创建
- 编译原理学习笔记·关于四种文法的理解以及 如何根据语言描述给出正则式或相应文法
- Mybatis缓存上
- 【C语言】【unix c】线程的退出,汇合,分离
- thinkPHP5 分页查询
- 【C语言】【unix c】线程同步,条件变量,mutex锁,信号量
- 点到三角形/直线/线段的距离
- 微信小程序 —— 自定义长圆形view
- sizeof PK strlen
- 正则表达式语法入门
- 二叉树的序遍历
- [转]矩阵奇异值分解(SVD)及其应用
- python 利用正则实现简易计算器
- Oracle笔记十二:集合、序列