先贴代码。for(i = 0; i < 2; i++) //创建2个线程。分别用来和另外的2个进程通信
{
g_hThread[i] = CreateThread( 0, 0,
(LPTHREAD_START_ROUTINE)RcvThread,
(VOID *)&g_Pcs[i], 0,
&dwThreadId);
}unsigned RcvThread(void *cs)
{
for(;;)
{
CRITICAL_SECTION* pCs = (CRITICAL_SECTION*)cs;
EnterCriticalSection(pCs);
if( !ReadFile(Ctrl->hPipe, //管道通信。从另外的2个进程读取数据
Ctrl->szData,
sizeof(Ctrl->szData),
&Ctrl->nBytes,
NULL ))
{ }
else
{
RcvData(lpData);
}
LeaveCriticalSection(pCs);
}
}void RcvData(LPTSTR lpData)
{
....
case msgA: //从进程A收到的消息
....;
case msgB: //从进程B收到的消息
WaitForsingleObject(...);
....;
case msgB:
....;
}按照业务逻辑。应该在处理完进程A的msgA消息后,再处理进程B的消息msgB。现在的问题是,有时候会先收到msgB。所以我打算在msgB的处理前加个WaitForsingleObject(...)来进行同步。不知道这样会不会造成死锁。我在某本书上看到,在关键代码段中加wairforsingleobject同步会容易造成死锁。
不知道还有没有其他的解决方法?
{
g_hThread[i] = CreateThread( 0, 0,
(LPTHREAD_START_ROUTINE)RcvThread,
(VOID *)&g_Pcs[i], 0,
&dwThreadId);
}unsigned RcvThread(void *cs)
{
for(;;)
{
CRITICAL_SECTION* pCs = (CRITICAL_SECTION*)cs;
EnterCriticalSection(pCs);
if( !ReadFile(Ctrl->hPipe, //管道通信。从另外的2个进程读取数据
Ctrl->szData,
sizeof(Ctrl->szData),
&Ctrl->nBytes,
NULL ))
{ }
else
{
RcvData(lpData);
}
LeaveCriticalSection(pCs);
}
}void RcvData(LPTSTR lpData)
{
....
case msgA: //从进程A收到的消息
....;
case msgB: //从进程B收到的消息
WaitForsingleObject(...);
....;
case msgB:
....;
}按照业务逻辑。应该在处理完进程A的msgA消息后,再处理进程B的消息msgB。现在的问题是,有时候会先收到msgB。所以我打算在msgB的处理前加个WaitForsingleObject(...)来进行同步。不知道这样会不会造成死锁。我在某本书上看到,在关键代码段中加wairforsingleobject同步会容易造成死锁。
不知道还有没有其他的解决方法?
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货