汽车司机与售票员之间必须协同工作,一方面,只有售票员把车门关好了司机才能开车,因此,售票员关好车门应通知司机开车。另一方面,只有当司机已经停 下,售票员才能开门上下客,故司机停车后应通知售票员。假定某辆公共汽车上有两名售票员与一名司机,汽车当前正在始发站停车上客,试设必要的信号灯及赋初值,写出他们的同步过程
分析: 司机停车,通知售票员开门,售票员关门,通知司机开车
使用到的函数和信号量
HANDLE mutex;
HANDLE empty;
HANDLE full;
创建信号量
HANDLE CreateSemaphore(
__in_opt LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,// lpSemaphoreAttributes是信号量的安全属性 可为NULL
__in LONG lInitialCount,// lInitialCount是初始化的信号量
__in LONG lMaximumCount,// lMaximumCount是允许信号量增加到最大值
__in_opt LPCWSTR lpName//lpName是信号量的名称 可为NULL
);
创建互斥信号量
HANDLE CreateMutex(
LPSECURITY_ATTRIBUTES lpMutexAttributes, // 指向安全属性的指针 可为NULL
BOOL bInitialOwner, // 初始化互斥对象的所有者
LPCTSTR lpName // 指向互斥对象名的指针
);
申请一个资源
WaitForSingleObject(HANDLE full,INFINITE);
释放资源
ReleaseSemaphore(
__in HANDLE hSemaphore,// hSemaphore是要增加的信号量句柄
__in LONG lReleaseCount,// lReleaseCount是增加的计数。
__out_opt LPLONG lpPreviousCount//lpPreviousCount是增加前的数值返回。
);
释放互斥信号量
BOOL ReleaseMutex(HANDLE hMutex);
DWORD WaitForMultipleObjects(
DWORD nCount, // number of handles in array
CONST HANDLE *lpHandles, // object-handle array
BOOL bWaitAll, // wait option
DWORD dwMilliseconds // time-out interval
);
1