Linux:同步信号量的应用
来源:互联网 发布:淘宝永立旅行箱怎么样 编辑:程序博客网 时间:2024/06/04 23:20
什么叫同步?
其实我认为只有存在异步了,我们才去用同步的方法来解决这个问题,那么官方的解释就是:异步环境下的一组并发进程因直接制约而互相发送消息、进行互相合作、互相等待,使得各进程按一定的速度执行的过程这种逻辑顺序称为进程间的同步。
然后怎么来实现进程的同步呢?
进程的同步
,比如说我现在利用 fork
函数建立了一个子进程,那么新建立的子进程就会原原本本的复制父进程的所有东西,包括 代码段、数据段、堆、栈等等。那么如果我现在想让一个数,从 0 然后每次加 1, 一直到 10 结束,假如我在父子进程都写这么一句话的话,输出的肯定不是我想要的结果,因为两个进程按照一定的调度算法进行工作,我想让其一直加到10这是不可能的,而且他们会输出两遍 1 - 10,所以现在就用到了同步信号量。
其实这个东西跟操作系统中学到的经典的同步问题挺相似的,只要会 P()、V()操作也就Ok了,建议先去搞懂 P()、V()操作的具体使用以及生产者消费者等几个经典问题,然后在来看我的代码,或者试着自己写一下。
声明两个信号量
父进程:
子进程:
下面就是简单的代码。
#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <sys/mman.h>#include <semaphore.h>int *pbuff = 0;//pbuff = 0;sem_t *s1, *s2;int main(){ int pid, bd, i = 0, tc, tf; pbuff = (int*)mmap(0, sizeof(int), PROT_READ|PROT_WRITE, MAP_ANON|MAP_SHARED, -1, 0); s1 = (sem_t*)mmap(0, sizeof(sem_t), PROT_READ|PROT_WRITE, MAP_ANON|MAP_SHARED, -1, 0); s2 = (sem_t*)mmap(0, sizeof(sem_t), PROT_READ|PROT_WRITE, MAP_ANON|MAP_SHARED, -1, 0); *pbuff = 0;//*puff = 0; sem_init(s1, 1, 1); sem_init(s2, 1, 0); pid = fork(); if(pid > 0){L: sem_wait(s2); tf = (*pbuff); sem_post(s1); if(tf > 0) printf("%d\n",tf); if(tf == 10 ) return 0; goto L; } else if(pid == 0){LL: tc = *pbuff; tc++; sem_wait(s1); (*pbuff) = tc; sem_post(s2); if((*pbuff) >= 10) return 0; goto LL; } else{ perror("Error"); } return 0;}
运行截图:
0 0
- Linux:同步信号量的应用
- 生产者-消费者问题实现 (linux下C同步信号量和互斥信号量的应用)
- Linux线程的信号量同步
- Linux线程的信号量同步
- Linux多线程同步对象:信号量应用
- Linux互斥与同步应用(四):posix信号量的互斥与同步
- Linux互斥与同步应用(五):system V信号量的互斥与同步
- linux进程间的通信--信号量同步
- linux应用编程笔记(13)信号量同步编程
- [Linux同步]读写信号量
- Linux 信号量同步实验
- linux 线程同步 信号量
- Linux 信号量同步编程
- Linux 同步机制:信号量
- VxWorks下的信号量同步与互斥的应用
- linux下信号量semaphore的应用
- linux下信号量semaphore的应用
- 线程的同步--信号量
- 2016/12/30javascript考试题
- 项目之谈
- 【网络流24题】太空飞行计划问题
- STM32之CAN ---CAN ID过滤器分析
- POJ 3101 Astronomy .
- Linux:同步信号量的应用
- JavaBean简单及使用
- spring应用程序使用教程
- memcache和redis区别
- 欢迎使用CSDN-markdown编辑器
- Java泛型通配符<? extends T>与<? super T>
- 39级台阶
- STM32 CAN 通讯 标示符过滤器设置 屏蔽寄存器全1
- Mybatis入门学之增删改查(二)