最高100分。我在主程序中创建了两个用CWinThread派生的线程,原意是让两个线程通过一个mutex读取一公共变量区。但是奇怪的是总是有一个线程得不到mutex。线程A:   被timer 唤醒,
   if (waitforsingleobject(h_mutex))
      写数据,then release h_mutex
   else return;线程B:  //不停的扫描循环
   while (1)
   {
      if ( waitforsingleobject(h_mutex))
          读书据,then release h_mutex
      else
         Sleep(1000);
   }我试过在主程序中创建mutex(用CreateMutex),然后将句柄传给线程A,B,也试过在线程A中创建mutex,然后在B中用openmutex通过mutex名得到mutex的句柄。不论用哪种情况,都是同样的问题:如果A先得到mutex,B就永远得不到mutex,反之亦然。但是releasemutex又从来不报错。我很不理解是为什么,请哪位高手指点一下,谢谢。

解决方案 »

  1.   

    把if语句改成:DWORD dwRet=::WaitForSingleObject(m_hMutex,INFINITE);
    if(dwRet==WAIT_OBJECT_0)
      

  2.   

    你一个release了另一个怎么能收得到呢,还有,为什么不用Event,Mutex这样用总觉得怪怪的
      

  3.   

    试验了下面的代码是可以的试验条件:
    FunctionA(),FunctionB()是CMyTabExampleApp的静态成员函数,m_hMutex是它的静态成员变量。在CMyTabExampleApp::InitInstance()中创建m_hMutex,initOwer=FALSE。然后用AfxBeginThread()创建两个线程。结果:
    B i=0
    .
    .
    .
    B i=999
    A i=0
    .
    .
    .UINT CMyTabExampleApp::FunctionA(void *p)
    {
    while(1)
    {
    DWORD dwRet=::WaitForSingleObject(m_hMutex,INFINITE);
    if(dwRet==WAIT_OBJECT_0)
    {
    for(int i=0;i<1000;i++)
    {
    TRACE("A i=%d\n",i);
    }
    ::ReleaseMutex(m_hMutex);
    }
    Sleep(0);
    }
    return 0;
    }UINT CMyTabExampleApp::FunctionB(void *p)
    {
    while(1)
    {
    DWORD dwRet=::WaitForSingleObject(m_hMutex,INFINITE);
    if(dwRet==WAIT_OBJECT_0)
    {
    for(int i=0;i<1000;i++)
    {
    TRACE("B i=%d\n",i);
    }
    ::ReleaseMutex(m_hMutex);
    }
    Sleep(0);
    }
    return 0;
    }
      

  4.   

    To: Cline(营营) 
    我想你的function A 和function B 就是thread A,B的执行程序吧。
    我的代码跟你不一样的地方就是所有跟mutex有关的API没有加::,我会试试看。但是你的结果好像并不是我所期望的那样,似乎你的B thread 一直霸占了mutex,直到thread结束才交给Thread A ,而我的程序里是需要两个thread一直相互交流信息的。To: zhaolaoxin(), shinesi(DaBaiCai)
    我才开始做线程间的通信,的确有些概念不是特别清晰。为什么不能释放mutex,mutex的本意应该是互斥信号灯,如果A不释放,B怎么能得到?而且我觉得很多同步信号例如mutex,event,还有一个semphere(?),似乎都可以通用,只是实现的方式不太一样而已。我说的有不对的地方还请多多指教。
      

  5.   

    No,No.一个Sleep(0),另一个就继续工作了。加不加“::”没关系!结果是:
    A i=0
    .
    .
    .
    A i=999
    B i=0
    .
    .
    .
    B i=999
    A i=0
    .
    .
    .请不要太相信TRACE()的输出结果.
      

  6.   

    我们的程序还有一点不同,就是m_hMutex的问题。我所查过的所有例子都是象你的例子一样两个thread公用同一个class的成员函数,而我的h_mutex是在两个独立的thread中的各自的windows cwnd派生类中使用的。即:两个thread都是各自独立的thread类,这两个不同的thread类中又各自有一个窗口类,真正处理数据的是窗口类的成员函数。我已经试过了加::,也试过了不releasemutex,都不行,问题依旧。我试着用DuplicateHandle建多一个handle试试。
      

  7.   

    好好的查查等待函数返回什么值.DWORD dwRet=::WaitForSingleObject(m_hMutex,INFINITE);
      

  8.   

    早就一条条查过了,如果用是时间2000L之类的就是超时错,如果用INFINITE 就是死翘翘,永远不出来。
      

  9.   

    问题解决了,是因为由于某种未知原因mutex未被释放。
    旧程序代码是:
    dwWaitResult = ::WaitForSingleObject(hMutex,1000L);
    switch (dwWaitResult)
    {
     case WAIT_OBJECT_0:
          //Do my jobs here     if (! ::ReleaseMutex ( hhMutex ))
    { //error process }
         break;
     case WAIT_TIMEOUT:
       //.....
       break; case WAIT_ABANDONED:
       //.....
       break;
     case WAIT_FAILED:
       //......
       break; }现在在最后添加了一句:
     ::ReleaseMutex ( hMutex );有可能是存在未公开的返回值。不过我现在改用CRITICAL_SECTION作了,这个方法适用我的程序,而且更简单。