先介绍一下信号量
1.创建信号量
void *OSCreateSem()
{
TSem *ptSem = malloc(sizeof(TSem));
if(ptSem)
{
if(sem_init(&ptSem->tSem, 0, 0) < 0)
{
free(ptSem);
return 0;
}
#ifdef _DEBUG
ptSem->l32IsValid = 0xbadbeef;
#endif
}
return ptSem;
}
2.删除信号量
void OSCloseSem(void *pvSem)
{
TSem *ptSem = pvSem;
if(ptSem)
{
#ifdef _DEBUG
assert(ptSem->l32IsValid == 0xbadbeef);
ptSem->l32IsValid = 0;
#endif
sem_destroy(&ptSem->tSem);
free(ptSem);
}
}
3.发送信号量
BOOL OSSetSem(void *pvSem)
{
TSem *ptSem = pvSem;
BOOL bRet = FALSE;
if(ptSem)
{
#ifdef _DEBUG
assert(ptSem->l32IsValid == 0xbadbeef);
#endif
if(!sem_post(&ptSem->tSem))
{
bRet = TRUE;
}
}
return bRet;
}
4.等待信号量
EWaitResult OSWaitSem(void *pvSem, l32 l32TimeOut)
{
TSem *ptSem = pvSem;
l32 l32RetCode;
l32 l32Waited = 0;
EWaitResult eResult = eWaitFailed;
if(ptSem)
{
#ifdef _DEBUG
assert(ptSem->l32IsValid == 0xbadbeef);
#endif
if(l32TimeOut == WAIT_FOREVER)
{
l32RetCode = sem_wait(&ptSem->tSem);
}
else if(l32TimeOut == WAIT_NOWAIT)
{
l32RetCode = sem_trywait(&ptSem->tSem);
}