我有一个公共资源,是一个unsigned char 类型的类成员,已经能从一个线程中获得初始值,之后通过SetEvent,使另一个处于等待中的线程WaitFor函数返回,并将当前的公共资源指针传递到被激活的WaitFor函数中去处理(见代码),我在WaitFor函数switch--case结构中加了EnterCriticalSection/LeaveCriticalSection,但是没有效果,如果稍微一改动WaitForMultipleObjects函数pThis->ImplementThreshold( pThis->yy,pThis->uu,pThis->vv)中的语句,就会有问题:1.传来的数据时而是固定的,时而是更新的,如果数据能够更新当然是好的情况,但此时设定的Critical Section锁定不了线程,线程间不断的切换,多了许多开销。请问各位,我是应该加入互斥,锁住线程,使更新的数据在一个线程中处理完,再释放。还是有什么其他的好办法。总之是效率与数据一致性要兼顾。
hEvent = WaitForMultipleObjects(2,pThis->m_hEventArray,false,1000);
hEvent = hEvent - WAIT_OBJECT_0;
switch (hEvent)
{
case 0:
RETAILMSG(1,(TEXT("SET EVENT DATA PROCESS EXIT\n")));
AfxEndThread(100);
break;
case 1:
InitializeCriticalSection(&pThis->m_csCommunicationSync);
EnterCriticalSection(&pThis->m_csCommunicationSync);
pThis->ImplementThreshold( pThis->yy,pThis->uu,pThis->vv); LeaveCriticalSection(&pThis->m_csCommunicationSync);
ResetEvent(pThis->m_hStartEvent);
break;
default:
break;
}
hEvent = WaitForMultipleObjects(2,pThis->m_hEventArray,false,1000);
hEvent = hEvent - WAIT_OBJECT_0;
switch (hEvent)
{
case 0:
RETAILMSG(1,(TEXT("SET EVENT DATA PROCESS EXIT\n")));
AfxEndThread(100);
break;
case 1:
InitializeCriticalSection(&pThis->m_csCommunicationSync);
EnterCriticalSection(&pThis->m_csCommunicationSync);
pThis->ImplementThreshold( pThis->yy,pThis->uu,pThis->vv); LeaveCriticalSection(&pThis->m_csCommunicationSync);
ResetEvent(pThis->m_hStartEvent);
break;
default:
break;
}
InitializeCriticalSection should only be called onceEnterCriticalSection/LeaveCriticalSection should be called by both thread that access the data you want to protect