具有Reset功能的多线程同步队列 - 3

王朝vc·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

BOOL CTreadSafeMsgQueue::GetMsg(MsgItem &Msg, int WaitTime)

{

if (!m_bInitedOK) return FALSE;

// 防止在reset期间导致Semaphore计数不正确

while (m_bStop)

{

TRACE("Thread %d Sleep\n", GetCurrentThreadId());

Sleep(SLEEP_TIME);

}

// 进入同步操作状态

m_ReadingThreadNum++;

if (WaitForSingleObject(m_S_Consumer, WaitTime) == WAIT_OBJECT_0)

{

if (WaitForSingleObject(m_E_Queue, WaitTime) == WAIT_OBJECT_0)

{

// OK now, Get message then

Msg = m_Queue[m_TailToRead++];

if (m_TailToRead >= MAX_QUE_SIZE) m_TailToRead = 0;

TRACE("Get message === %d\n", Msg.MsgID);

ReleaseSemaphore(m_S_Producer, 1, NULL);

SetEvent(m_E_Queue);

m_ReadingThreadNum--;

return TRUE;

}

else // wait event time out

{

// not Get message so release Consumer

ReleaseSemaphore(m_S_Consumer, 1, NULL);

SetEvent(m_E_Queue);

m_ReadingThreadNum--;

return FALSE;

}

}

else // wait semaphore time out

{

m_ReadingThreadNum--;

return FALSE;

}

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有  導航