您的位置:首页 > 运维架构 > Linux

Linux:同步信号量的应用

2017-01-02 20:16 274 查看
什么叫同步?

其实我认为只有存在异步了,我们才去用同步的方法来解决这个问题,那么官方的解释就是:异步环境下的一组并发进程因直接制约而互相发送消息、进行互相合作、互相等待,使得各进程按一定的速度执行的过程这种逻辑顺序称为进程间的同步。

然后怎么来实现进程的同步呢?

进程的同步

,比如说我现在利用
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;
}


运行截图:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: