我有一个公共资源,是一个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;

}

解决方案 »

  1.   

    如果共享数据真的只是一个unsigned char,不需要作任何多线程的保护,把它声明为volatile就足够了。看你贴的程序,共享的不止是一个unsigned char, 而是yy uu vv, 一组三个成员。真需要保护的话你的方法也不对
    InitializeCriticalSection should only be called onceEnterCriticalSection/LeaveCriticalSection should be called by both thread that access the data you want to protect
      

  2.   

    用户线程互斥的临界区和互斥体(Mutex),互斥体是核心态对象,应用程序使用它时会切换到核心态,而临界区则直接在用户态下工作,所以如果可能,应该用临界区取代互斥体。
      

  3.   

    直接用关键代码段 不需要WaitForMultipleObjects
      

  4.   

    我保护的数据的确是一段内存中的unsigned char,有三个指针指向这段数据的不同位置,0~76800,76800~96000,96000~115200
      

  5.   

    问题没有交代明白,WaitFor是等提取原始数据的线程将工作做完,并且SetEvent,这时才开始工作,将数据做进一步处理