信号量的互斥与同步
来源:互联网 发布:水镜先生知乎 编辑:程序博客网 时间:2024/05/16 18:43
一、信号量互斥
公示栏问题:同学A在公示栏上写“数学课取消”,同学B然后又写了“英语课考试”。但是当,同学A写下“数学课”后。出去了一下,这是同学B写了“英语课考试”,同学A再回来写“取消”。这时我们所要传达的意思就完全不一样了。所以需要引入互斥。
1. 信号量
信号量(又名:信号灯)与其他进程间通信方式不大相同,主要用途是保护临界资源(进程互斥)。进程可以根据它判定是否能够访
公示栏问题:同学A在公示栏上写“数学课取消”,同学B然后又写了“英语课考试”。但是当,同学A写下“数学课”后。出去了一下,这是同学B写了“英语课考试”,同学A再回来写“取消”。这时我们所要传达的意思就完全不一样了。所以需要引入互斥。
1. 信号量
信号量(又名:信号灯)与其他进程间通信方式不大相同,主要用途是保护临界资源(进程互斥)。进程可以根据它判定是否能够访
问某些共享资源。除了用于访问控制外,还可用于进程同步。
2.信号量分类:
二值信号灯:信号灯的值只能取0或1
3.指定键值
2.信号量分类:
二值信号灯:信号灯的值只能取0或1
计数信号灯:信号灯的值可以取任意非负值。
3.指定键值
①任意指定一个数
缺点:这个数已经被别的IPC对象(消息队列,共享内存)
所使用了,在与新创建的信号量关联时就会失败。
②构造一个尽量不会被别的IPC对象用到的数
方法:使用key_t ftok( char * fname, int id )
Ftok工作原理:将fname和id相组合,组成一个信号量
4.程序代码
student1.c
student2.c
二、信号量同步
1.进程同步
一组并发进程进行互相合作、互相等待,使得各进程按一定的顺序执行的过程称为进程间的同步。
2.生产者消费者问题
生产者生产完产品后,消费者才能把产品拿走。如果还没生产完,消费者就拿走的话,会造成不同步。
3.程序代码
通过生产者设置信号量为0后,只有生产完产品才释放信号量。之后消费者才能取走产品。
productor.c
customer.c
Ftok工作原理:将fname和id相组合,组成一个信号量
4.程序代码
student1.c
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <fcntl.h>
- #include <unistd.h>
- #include <sys/ipc.h>
- #include <sys/sem.h>
- void main()
- {
- int fd;
- int ret;
- key_t key;
- int semid;
- struct sembuf sops;
-
- /*创建键值*/
- key = ftok("/home", 1);
- /*创建并打开信号量集合*/
- semid = semget(key,1,IPC_CREAT);
- ret = semctl(semid, 0, SETVAL, 1); //将信号量个数初始设置为1
- /*0.打开文件*/
- fd = open("./board.txt",O_RDWR|O_APPEND);
- if(fd < 0)
- {
- printf("file open fialed.\n");
- return;
- }
- /*获取信号量*/
- sops.sem_num = 0;
- sops.sem_op = -1;
- ret = semop(semid, &sops,1);
-
- /*1.向文件公告板写入“数学课”*/
- write(fd, "class math ", 11);
- /*2.暂停休息*/
- sleep(10);
- /*3.向公告板写入“取消”*/
- write(fd, "is cancel ",11);
- /*释放信号量*/
- sops.sem_num = 0;
- sops.sem_op = 1;
- ret = semop(semid, &sops, 1);
- close(fd);
- }
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <unistd.h>
- #include <fcntl.h>
- #include <sys/ipc.h>
- #include <sys/sem.h>
- void main()
- {
- int fd;
- int ret;
- key_t key;
- int semid;
- struct sembuf sops;
- /*打开信号量*/
- key = ftok("/home",1);
- semid = semget(key, 1, IPC_CREAT);
- /*打开文件*/
- fd = open("./board.txt", O_RDWR|O_APPEND);
- ret = semctl(semid, 0, GETVAL);
- printf("the value of sem is %d\n",ret);
-
- /*获取信号量*/
- sops.sem_num = 0;
- sops.sem_op = -1;
- semop(semid, &sops, 1);
- /*写入“英语课考试”*/
- write(fd, "english exam", 20);
- /*释放信号量*/
- sops.sem_num = 0;
- sops.sem_op = 1;
- semop(semid, &sops, 1);
- /*结束*/
- close(fd);
- }
1.进程同步
一组并发进程进行互相合作、互相等待,使得各进程按一定的顺序执行的过程称为进程间的同步。
2.生产者消费者问题
生产者生产完产品后,消费者才能把产品拿走。如果还没生产完,消费者就拿走的话,会造成不同步。
3.程序代码
通过生产者设置信号量为0后,只有生产完产品才释放信号量。之后消费者才能取走产品。
productor.c
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <fcntl.h>
- #include <unistd.h>
- #include <sys/ipc.h>
- #include <sys/sem.h>
- void main()
- {
- int fd;
- key_t key;
- struct sembuf sops;
- int semid;
- /*创建信号量*/
- key = ftok("/root", 1);
- semid = semget(key, 1, IPC_CREAT);
- semctl(semid, 0, SETVAL, 0);
- /*创建文件*/
- fd = open("./product.txt", O_RDWR|O_CREAT, 0666);
- /*休息*/
- sleep(20);
- /*往文件写入内容*/
- write(fd, "write something.", 16);
- /*释放信号量*/
- sops.sem_num = 0;
- sops.sem_op = 1;
- semop(semid, &sops, 1);
- close(fd);
- }
- #include <sys/types.h>
- #include <stdlib.h>
- #include <sys/ipc.h>
- #include <sys/sem.h>
- void main()
- {
- key_t key;
- int semid;
- struct sembuf sops;
- int ret;
- /*获取信号量*/
- key = ftok("/root", 1);
- semid = semget(key, 1, IPC_CREAT);
- sops.sem_num = 0;
- sops.sem_op = -1;
- sops.sem_flg = SEM_UNDO;
- ret = semop(semid, &sops, 1);
- printf("ret is %d",ret);
- /*取走文件*/
- system("cp ./product.txt ./ship/");
- // sops.sem_num = 0;
- // sops.sem_op = 1;
- // semop(semid, &sops, 1);
- }
0
上一篇:linux应用编程学习(6)信号
下一篇:共享内存通信
相关热门文章
- test123
- 编写安全代码——小心有符号数...
- 使用openssl api进行加密解密...
- 一段自己打印自己的c程序...
- 彻底搞定C语言指针详解-完整版...
给主人留下些什么吧!~~
评论热议
阅读全文
0 0
- 信号量------线程的同步与互斥
- 信号量的互斥与同步
- 信号量的互斥同步
- VxWorks下的信号量同步与互斥的应用
- Linux互斥与同步应用(四):posix信号量的互斥与同步
- Linux互斥与同步应用(五):system V信号量的互斥与同步
- 用信号量解决进程的同步与互斥探讨
- 用信号量解决进程的同步与互斥探讨
- 用信号量解决进程的同步与互斥
- 线程的同步与互斥:条件变量&信号量
- Linux利用信号量实现线程的同步与互斥
- PV操作、信号量、同步与互斥
- linux信号量---互斥与同步
- linux互斥与同步 之 信号量 读写信号量
- 互斥量与信号量(互斥与同步)
- 信号量和同步互斥
- AND型信号量与信号量集-----进程的同步与互斥面向对象的解决方案(二)
- 【线程的同步与互斥 (互斥量 条件变量 信号量)】生产者与消费者模型
- Linux应用程序地址布局
- 静态函数库、动态链接库设置
- css技巧—图片配文字
- linux应用编程学习(6)信号
- 通过自定义属性添加样式(css+js,动态判断背景颜色)
- 信号量的互斥与同步
- 共享内存通信
- 消息队列编程
- 多线程互斥和同步
- Linux网络编程协议
- TCP/UDP socket编程学习
- vim多行增加缩进
- yii2 邮件发送教程
- 网络并发服务器设计
原创粉丝点击
热门IT博客
热门问题
老师的惩罚
人脸识别
我在镇武司摸鱼那些年
重生之率土为王
我在大康的咸鱼生活
盘龙之生命进化
天生仙种
凡人之先天五行
春回大明朝
姑娘不必设防,我是瞎子
孩子流鼻子咳嗽怎么办
宝宝流鼻子咳嗽怎么办
婴儿咳嗽流鼻子怎么办
水晶泥做脆了怎么办
水晶泥太脆怎么办方法
水晶泥做硬了怎么办
微博自己乱点赞怎么办
经期喝了普洱茶怎么办
粉蒸肉太干了怎么办
做口水鸡不入味怎么办
啤酒变质喝了怎么办
做啤酒鸭水少了怎么办
红烧肉的瘦肉硬怎么办
五花肉煮烂了怎么办
炖牛肉先放盐了怎么办
炖鸡汤先放盐了怎么办
一直血压高怀孕怎么办
怀孕了有高血压怎么办
早孕期血压高怎么办
怀孕心里难受不舒服怎么办
煮红枣有白沫怎么办
吃了不胖怎么办
吃牛肉肚子胀怎么办
吃肉多了胃难受怎么办
吃完嘎啦肉恶心怎么办
吃肉油腻恶心怎么办
肉吃多了想吐怎么办
我的胃疼怎么办
肉吃多了胃难受怎么办
吃猪肝中毒了怎么办?
猫咪吃猪肝中毒怎么办
孕中期先兆流产怎么办
先兆流产的症状怎么办
炒猪肝没有淀粉怎么办
烧菜没有生姜怎么办
吃了硫磺熏制怎么办
孕妇吃了炸薯条怎么办
黄瓜丝怎么办比较好吃
干海带怎么做怎么办
炝土豆丝儿怎么办
吃韭菜胃难受怎么办