我想把Msg里面的鎖取消掉,但是又害怕
雖然MsgList有鎖,又怕執行完畢后 ,多個執行緒又同時到達Msg會不會出現資料混亂
本人對多執行緒不是非常精,請大佬指點

uj5u.com熱心網友回復:
BOOL CMsgList::bPutMsgQuene(char cFrom, char * pData, DWORD dwMsgSize, int iIndex, char cKey)
{
EnterCriticalSection(&m_cs);//加鎖
if (m_pMsgQueue[m_iQueueTail] != NULL)
{
LeaveCriticalSection(&m_cs);//解鎖
return FALSE;
}
m_pMsgQueue[m_iQueueTail] = new class CMsg;
if (m_pMsgQueue[m_iQueueTail] == NULL)
{
LeaveCriticalSection(&m_cs);//解鎖
return FALSE;
}
if (m_pMsgQueue[m_iQueueTail]->bPut(cFrom, pData, dwMsgSize, iIndex, cKey) == FALSE)
{
LeaveCriticalSection(&m_cs);//解鎖
return FALSE;
}
m_iQueueTail++;
if (m_iQueueTail >= DEF_MSGQUEUESIZE) m_iQueueTail = 0;
LeaveCriticalSection(&m_cs);//解鎖
return TRUE;
}
BOOL CMsg::bPut(char cFrom, char * pData, DWORD dwSize, int iIndex, char cKey)
{
EnterCriticalSection(&m_cs);//加鎖
m_pData = new char [dwSize + 1];
if (m_pData == NULL) return FALSE;
ZeroMemory(m_pData, dwSize + 1);
memcpy(m_pData, pData, dwSize);
m_dwSize = dwSize;
m_cFrom = cFrom;
m_iIndex = iIndex;
m_cKey = cKey;
LeaveCriticalSection(&m_cs);//解鎖
return TRUE;
}
void CMsg::Get(char * pFrom, char * pData, DWORD * pSize, int * pIndex, char * pKey)
{
EnterCriticalSection(&m_cs);//加鎖
*pFrom = m_cFrom;
memcpy(pData, m_pData, m_dwSize);
*pSize = m_dwSize;
*pIndex = m_iIndex;
*pKey = m_cKey;
LeaveCriticalSection(&m_cs);//解鎖
}
uj5u.com熱心網友回復:
這個是執行緒函式void CMainLog::MsgProcess()
{
EnterCriticalSection(&m_cs);//加鎖
while (G_MsgList.bGetMsgQuene(&cFrom, pData, &dwMsgSize, &iClientH, &cKey) == TRUE)
{
里面有IOCp放入佇列的資料就提取出來處理
}
LeaveCriticalSection(&m_cs);//解鎖
uj5u.com熱心網友回復:
必須的,如果訪問量比較大,可以區分一下,兩個鎖,讀鎖與寫鎖讀鎖被占用,可以讀,不可以寫
寫鎖被占用,不可以讀,不可以寫
uj5u.com熱心網友回復:
《Windows核心編程》uj5u.com熱心網友回復:
你回答像放屁一樣,我在誠心請教,你就發一本書,起到什么作用?
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/244476.html
標籤:C++ 語言
上一篇:這怎么搞啊
