互斥的问题:优先级继承、删除安全和递归。
z 计数信号量(counting):适用于保护具有多个数据的资源。
4.1 信号量的控制
Wind 内核为上述三类信号量提供不同的创建函数:semBCreate() 、
semMCreate()和 semCCreate(),但提供统一的控制函数:semDelete()、semTake()、
semGive()、semFlush()。它们的原型分别为:
SEM_ID semBCreate ( int options, SEM_B_STATE initialState);
/* create and initialize a binary semaphore*/
SEM_ID semMCreate ( int options);
/* create and initialize a mutual-exclusion semaphore*/
SEM_ID semCCreate ( int options, int initialCount);
/* create and initialize a counting semaphore*/
STATUS semDelete ( SEM_ID semId); /* delete a semaphore */
STATUS semGive ( SEM_ID semId); /* give a semaphore*/
STATUS semTake ( SEM_ID semId, int timeout); /* take a semaphore*/
STATUS semFlush ( SEM_ID semId); /* unblock every task pended on a semaphore*/
下面的例子使用二进制信号量。二进制信号量可以作为资源可用或不可用的
标志。任务使用 semTake()取一个信号量,其结果取决于调用时该二进制信号量
是否可用。如果可用,信号量将变得不可用,而任务继续执行。如果信号量不可
用,任务被挂起到任务阻塞队列,直到该信号量可用。
当任务释放一个二进制信号量时要调用 semGive(),其结果也要依赖于调用
时刻该信号量是否可用。如果可用,本次释放信号量不起任何作用;如果信号量
不可用,而且没有任务在等待该信号量,那么信号量变为可用;如果信号量不可
用,并且有一个或多个任务等待该信号量,那么阻塞队列中的第一个任务解除阻
塞,而信号量仍不可用。
例中,两个任务(taskOne 和 taskTwo)竞争修改一个全局变量 global 的值,
任务 taskOne 将 Global 修改为 1,而任务 taskTwo 则将其修改为 0。
- 1
- 2
前往页