信号量的使用,求助

来源:百度知道 编辑:UC知道 时间:2024/09/28 12:36:16
有一个更衣室,男女都可以进,但女进了,男的就不能进,要更衣室里面没有女才能进。这个更衣室没有人数限制,可以放很多女的。同样地,如果男的进了,女的就不能进,要等更衣室里面没有男才能进。这个更衣室没有人数制,可以放很多男的。还有,女的不能在更衣室外面等超过5分钟,女的要有优先的权利,但又不能让男人等太久。

请问怎样可以把上面的东西变成 信号量 的程序。
成功回答问题,追加100。

信号量:一个整数;
大于或等于0时代表可供并发进程使用的资源实体数;
小于0时代表正在等待使用临界区的进程数;
用于互斥的信号量初始值应大于0;
只能通过P、V原语操作而改变;
信号量元素组成:
1、表示信号量元素的值;
2、最后操作信号量元素的进程ID
3、等待信号量元素值+1的进程数;
4、等待信号量元素值为0的进程数;

二、主要函数

1.1 创建信号量
int semget(
key_t key, //标识信号量的关键字,有三种方法:1、使用IPC——PRIVATE让系统产生,
// 2、挑选一个随机数,3、使用ftok从文件路径名中产生
int nSemes, //信号量集中元素个数
int flag //IPC_CREAT;IPC_EXCL 只有在信号量集不存在时创建
)
成功:返回信号量句柄
失败:返回-1

1.2 使用ftok函数根据文件路径名产生一个关键字
key_t ftok(const char *pathname,int proj_id);
路径名称必须有相应权限

1.3 控制信号量
int semctl(
int semid, //信号量集的句柄
int semnum, //信号量集的元素数
int cmd, //命令
/*union senum arg */... //
)
成功:返回相应的值
失败:返回-1

命令详细说明:
cmd: IPC_RMID 删除一个信号量
IPC_EXCL 只有在信号量集不存在时创建
IPC_SET 设置信号量的许可权
SETVAL 设置指定信号量的元素的值为 agc.val
GETVAL 获得一个指定信号量的值
GETP