-
Notifications
You must be signed in to change notification settings - Fork 1
/
Counting Semaphores.c
64 lines (52 loc) · 1.17 KB
/
Counting Semaphores.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
/* 计数信号量 Counting Semaphores */
SEM_ID semCCreate
(
int options, /* 选项 */
int initialCount /* 初始计数 */
)
/* exp */
countSem = semCCreate(SEM_Q_FIFO, 0 );
/* 计数信号量实现资源状况监视的例子 */
/* 头文件 */
#include "vxWorks.h"
#include "semLib.h"
/* 全局变量 */
SEM_ID countSem = NULL; /* 信号量ID */
/*********************************************************
* init - 初始化程序
* 负责创建一个计数信号量
* RETURNS:OK, ERROR
* 信号量初始个数initialCount为0
* options选为先到先出方式
*/
STATUS init()
{
countSem = semCCreate(SEM_Q_FIFO, 0 );
if (countSem == NULL) /* 创建操作失败 */
{
return ERROR;
}
return OK;
}
/**************************************************************
* task1 - 生产资源的任务
* 生产完单位个数的资源后,调用semGive()记录资源的增加
*/
task1()
{
...
... /* 生产单位个数的资源 */
semGive(countSem); /* 资源数量加1 */
...
}
/**************************************************************
* task2 - 使用资源的任务
* 使用完单位个数的资源后,调用semTake()记录资源的减少
* 当技术信号量变为不可用时,阻塞(Pend)等待。
*/
task2()
{
...
semTake(countSem, WAIT_FOREVER); /* 等待,直到有资源可用,资源数量减1 */
... /* 处理资源 */
}