一个子函数:
void    createM()  //建立内核对象
{
  HANDLE handle;
   if( ( handle =OpenMutex( MUTEX_ALL_ACCESS,FALSE,"SA" )) == NULL )
       handle = CreateMutex( NULL,FALSE,"SA" ); 
   OpenMutex( MUTEX_ALL_ACCESS,FALSE,"SA" );}另一个函数:
 void check()
{
    HANDLE handp = NULL;
    if( (handp = OpenMutex( MUTEX_ALL_ACCESS,FALSE,"SA" )) !=  NULL )
{
     WaitForSingleObject( handp,INFINITE );
}
}在主程序中,先调用createM(),然后子线程调用check(),发现程序并没有在waiforsingleobject被阻塞,非常另人奇怪,因为我的第一函数并没有释放。为什么呢?我用的是socket accept 让程序产生子线程,并且在主程序中建立内核,在socket 生成的子线程中调用check.请高人指教。

解决方案 »

  1.   

    在第一个函数里面释放内核对象吧
    CloseHandle(handle);
      

  2.   

    内核对象需要关闭
    CloseHandle
      

  3.   

    在第一个函数里我不释放内核是因为我要的目的是在主程序里首先占用内核,其他子线程可以被阻塞一会,这样我的主程序可以做其他的事情,我只是想知道为什么不能在执行waitsingleobject时阻塞?
      

  4.   

    因为CreateMutex( NULL,FALSE,"SA" ); 的第二个参数为FALSE,你的调用线程(即这里你的主线程)没有获得Mutext的所有权,当然aitsingleobject不会被阻塞了(你的情况是没有哪一个线程获取了mutex的所有权。
      

  5.   

    楼上的师兄:主线程确实没有获得Mutext的所有权,但其他线程如果打开了Mutext时自然就是我们所说的获得了所有的控制权,而另外就只有等待了。可情况并不是如此,奈何奈何?
      

  6.   

    在The CreateMutex function creates a named or unnamed mutex object
    bInitialOwner 
    Specifies the initial owner of the mutex object. If this value is TRUE and the caller created the mutex, the calling thread obtains ownership of the mutex object. Otherwise, the calling thread does not obtain ownership of the mutex. To determine if the caller created the mutex, see the Return Values section. 
    (ZT自MSDN), 第二个参数你用FALSE该考虑一下吧? 另外, CreateM后,应该ReleaseMutex的.
    check函数通过Waitforsingleeobject取得该内河对象的控制权后, 在使用完毕后应该ReleaseMutex的啊,以供其它现成继续获得控制权
      

  7.   

    to wagzt724(蓝天):
    OpenMutex就获得了所有权?没有这种说法吧。比如一个线程拥有mutext的所有权,它一直没有releasemutext,你能够去抢啊?
      

  8.   

    谢谢楼上:你说的很对,OpenMutex只是有打开的动作,但不一定能打开,不一定获得控制权,但打不开后应该被阻塞,因为是护持对象,所有任意时刻只有一个线程能使用。另外如果我想用一个共享对象来约束m-1个线程的行为,当我的特殊的线程i进行操作时,其他所有线程都必须阻塞在waitforsingleobject处,当线程i结束后,其他线程才能都结束阻塞继续执行,用什么方法呢?
      

  9.   

    waitforsingleobject,第一个参数传递第i个线程的句柄