请教一个关于多线程设计问题,每一个类都需要加锁吗?请大佬帮忙看下

skyddr99 2021-01-04 04:43:15
我想把Msg里面的锁取消掉,但是又害怕

虽然MsgList有锁,又怕执行完毕后 ,多个线程又同时到达Msg会不会出现数据混乱

本人对多线程不是非常精,请大佬指点



...全文
143 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
源代码大师 2021-05-08
  • 打赏
  • 举报
回复
希望对你有帮助:https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助:https://blog.csdn.net/it_xiangqiang/category_10768339.html
赵4老师 2021-01-05
  • 打赏
  • 举报
回复
我当年就是看了这本书后,才彻底弄懂多线程的。
赵4老师 2021-01-05
  • 打赏
  • 举报
回复
引用 5 楼 skyddr99 的回复:
[quote=引用 4 楼 赵4老师 的回复:]《Windows核心编程》
你回答像放屁一样,我在诚心请教,你就发一本书,起到什么作用?[/quote] 尊师重教
skyddr99 2021-01-04
  • 打赏
  • 举报
回复
引用 4 楼 赵4老师 的回复:
《Windows核心编程》
你回答像放屁一样,我在诚心请教,你就发一本书,起到什么作用?
赵4老师 2021-01-04
  • 打赏
  • 举报
回复
《Windows核心编程》
Minikinfish 2021-01-04
  • 打赏
  • 举报
回复
必须的,如果访问量比较大,可以区分一下,两个锁,读锁与写锁 读锁被占用,可以读,不可以写 写锁被占用,不可以读,不可以写
skyddr99 2021-01-04
  • 打赏
  • 举报
回复
这个是线程函数
void CMainLog::MsgProcess()
{
	 
	
		 EnterCriticalSection(&m_cs);//加锁
	while (G_MsgList.bGetMsgQuene(&cFrom, pData, &dwMsgSize, &iClientH, &cKey) == TRUE)
	{
里面有IOCp放入队列的数据就提取出来处理
}

	LeaveCriticalSection(&m_cs);//解锁
skyddr99 2021-01-04
  • 打赏
  • 举报
回复


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);//解锁
}

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧