以卖票为列的共享内存和信号量的学习
来源:互联网 发布:众人皆知的拼音 编辑:程序博客网 时间:2024/06/06 08:40
经典桥段:李老师卖票
1 通过共享内存实现
//shmid 创建并获取共享内存#include <sys/ipc.h>#include <sys/shm.h>//shmat 映射共享内存 解除映射#include <sys/types.h>#include <sys/shm.h>//删除共享内存 #include <sys/ipc.h> #include <sys/shm.h>#include <stdio.h>#include <string.h>#include <time.h>typedef struct _shm{int flag; //锁int ticket; //票}SHM;void sell_ticket(SHM* shmp){while(1){int time = rand()%10 + 1;usleep(time * 100000);if(shmp->flag == 1){shmp->flag = 0;if(shmp->ticket == 0){shmp->flag = 1;break;}printf("卖了第%d张票\n",shmp->ticket);shmp->ticket--;shmp->flag = 1;}}}int main(int argc,char ** argv){srand((unsigned int)time(NULL));//创建贡献内存int shmid = shmget((key_t)1234,sizeof(SHM),0666|IPC_CREAT); //加一个创建宏if(shmid == -1){perror("shmget");return -1;}//映射共享内存SHM * shmp = (SHM*)shmat(shmid,NULL,0);if(argc == 2){shmp->flag = 1;shmp->ticket = 100;}sell_ticket(shmp);if(argc == 2){//解除共享内存shmdt(shmp);//删除共享内存shmctl(shmid,IPC_RMID,NULL); //删除宏}return 0;}
2 通过信号量实现的卖票系统
头文件
#ifndef __SEMAPHORE_H__#define __SEMAPHORE_H__//控制信号量 semctl 用于初始化和删除 operate(操作)#include <sys/types.h>#include <sys/ipc.h>#include <sys/sem.h>//操作信号量 semop 用于P操作和V操作 control(控制)#include <sys/types.h>#include <sys/ipc.h>#include <sys/sem.h>//创建信号量 semget#include <sys/types.h>#include <sys/ipc.h>#include <sys/sem.h>union semun { int val; /* Value for SETVAL */ struct semid_ds *buf; /* Buffer for IPC_STAT, IPC_SET */ unsigned short *array; /* Array for GETALL, SETALL */ struct seminfo *__buf; /* Buffer for IPC_INFO (Linux specific) */};//初始化信号量int sem_init(int sem_id){union semun sem;sem.val = 1;int ret = semctl(sem_id, 0, SETVAL, sem);return ret;}//信号量p操作int sem_p(int sem_id){struct sembuf sem;sem.sem_num = 0;sem.sem_op = -1; //p操作sem.sem_flg = SEM_UNDO;int ret = semop(sem_id, &sem, 1);return ret;}//信号量v操作int sem_v(int sem_id){struct sembuf sem;sem.sem_num = 0;sem.sem_op = 1; //v操作sem.sem_flg = SEM_UNDO;int ret = semop(sem_id, &sem, 1);return ret;}//删除信号量int sem_del(int sem_id){int ret = semctl(sem_id, 0, IPC_RMID);return ret;}#endif实现函数
//shmid 创建并获取共享内存#include <sys/ipc.h>#include <sys/shm.h>//shmat 映射共享内存 解除映射#include <sys/types.h>#include <sys/shm.h>//删除共享内存#include <sys/ipc.h> #include <sys/shm.h>//信号量#include "semaphore.h"#include <stdio.h>#include <string.h>#include <time.h>typedef struct _shm{int ticket; //票}SHM;void sell_ticket(SHM* shmp,int sem_id){while(1){int time = rand()%10 + 1;usleep(time * 1000);//p操作sem_p(sem_id);if(shmp->ticket == 0) //票卖完{sem_v(sem_id);break;}printf("卖了第%d张票\n",shmp->ticket);shmp->ticket--;//v操作sem_v(sem_id);}}int main(int argc,char ** argv){srand((unsigned int)time(NULL));//创建共享内存int shmid = shmget((key_t)1234,sizeof(SHM),0666|IPC_CREAT); //加一个创建宏if(shmid == -1){perror("shmget");return -1;}//创建信号量int sem_id = semget((key_t)2345 , 1, 0666|IPC_CREAT);if(sem_id == -1){perror("shmget");return -1;}//映射共享内存SHM * shmp = (SHM*)shmat(shmid,NULL,0);if(argc == 2){//初始化信号量sem_init(sem_id);shmp->ticket = 100;}sell_ticket(shmp,sem_id);if(argc == 2){//解除共享内存shmdt(shmp);//删除共享内存shmctl(shmid,IPC_RMID,NULL); //删除宏//删除信号量sem_del(sem_id);}return 0;}
阅读全文
1 1
- 以卖票为列的共享内存和信号量的学习
- 用共享内存和信号量实现的简单的卖票系统
- 信号量 消息对列 共享内存的删除办法
- 共享内存和信号量的使用
- 信号量和共享内存的配合使用
- 进程间通信之分别用共享内存和信号量实现卖票
- 共享内存的创建 实现卖票的程序
- 共享内存和信号量
- 信号量和共享内存
- 信号量和进程共享内存的小例子
- 通过共享内存和信号量实现进程间的通信
- 加入信号量的简易卖票系统
- linux共享内存与信号量的使用
- 信号量学习 & 共享内存同步
- 多线程的使用实列-卖票系统
- Linux信号量和共享内存
- linux学习---基于内存的IPC(共享内存,信号量数组,消息队列)
- [转]一个很好的Linux共享内存和信号量的例子
- 太空飞行计划
- 东岱FabCost成本管理控制系统批量导入零件加工清单,助企业控制成本,提高加工效率
- Python类和继承
- Spring Boot application.propertis
- 消息队列 与 邮件发送
- 以卖票为列的共享内存和信号量的学习
- 小小粉丝度度熊 HDU
- CSU 1511——残缺的棋盘
- 继承
- 装箱
- java Map的遍历
- 暑期ssh框架spring学习笔记二
- apache
- pycharm破解的两种方式