Linux:同步信号量的应用
2017-01-02 20:16
274 查看
什么叫同步?
其实我认为只有存在异步了,我们才去用同步的方法来解决这个问题,那么官方的解释就是:异步环境下的一组并发进程因直接制约而互相发送消息、进行互相合作、互相等待,使得各进程按一定的速度执行的过程这种逻辑顺序称为进程间的同步。
然后怎么来实现进程的同步呢?
进程的同步
,比如说我现在利用
其实这个东西跟操作系统中学到的经典的同步问题挺相似的,只要会 P()、V()操作也就Ok了,建议先去搞懂 P()、V()操作的具体使用以及生产者消费者等几个经典问题,然后在来看我的代码,或者试着自己写一下。
声明两个信号量 s1、s2:
父进程:
p(s2)
V(s1)
子进程:
p(s1)
V(s2)
下面就是简单的代码。
运行截图:
其实我认为只有存在异步了,我们才去用同步的方法来解决这个问题,那么官方的解释就是:异步环境下的一组并发进程因直接制约而互相发送消息、进行互相合作、互相等待,使得各进程按一定的速度执行的过程这种逻辑顺序称为进程间的同步。
然后怎么来实现进程的同步呢?
进程的同步
,比如说我现在利用
fork函数建立了一个子进程,那么新建立的子进程就会原原本本的复制父进程的所有东西,包括 代码段、数据段、堆、栈等等。那么如果我现在想让一个数,从 0 然后每次加 1, 一直到 10 结束,假如我在父子进程都写这么一句话的话,输出的肯定不是我想要的结果,因为两个进程按照一定的调度算法进行工作,我想让其一直加到10这是不可能的,而且他们会输出两遍 1 - 10,所以现在就用到了同步信号量。
其实这个东西跟操作系统中学到的经典的同步问题挺相似的,只要会 P()、V()操作也就Ok了,建议先去搞懂 P()、V()操作的具体使用以及生产者消费者等几个经典问题,然后在来看我的代码,或者试着自己写一下。
声明两个信号量 s1、s2:
父进程:
p(s2)
V(s1)
子进程:
p(s1)
V(s2)
下面就是简单的代码。
#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; }
运行截图:
相关文章推荐
- Linux互斥与同步应用(五):system V信号量的互斥与同步
- Linux互斥与同步应用(四):posix信号量的互斥与同步
- linux应用编程笔记(13)信号量同步编程
- 生产者-消费者问题实现 (linux下C同步信号量和互斥信号量的应用)
- linux 内核同步机制-自旋锁与信号量及其区别
- linux 多线程编程 之 信号量互斥同步
- linux内核同步方式--信号量
- linux下信号量semaphore的应用
- linux应用之文件实时同步(sersync)
- Linux内核同步机制之信号量与锁
- VxWorks下的信号量同步与互斥的应用
- linux 内核同步机制-自旋锁与信号量及其区别
- linux 多线程用信号量进行同步例子
- Linux驱动:信号量同步测试
- Linux下通过共享内存进行进程间通信,进程间同步使用信号量来实现
- linux 多线程编程 之 信号量互斥同步
- Linux 2.4 内核的同步机制(1) (信号量)
- Linux 2.4 内核的同步机制(1) (信号量)
- linux下信号量semaphore的应用
- Linux平台用C++实现信号量,同步线程