WaitForSingleObject试图获得指定对象的控制权,如果指定对象被占用,则挂起直到超时。
当多线程访问同一对象时可以使用WaitForSingleObject访问互斥对象,如果用MFC的同步对象时,建议使用CSingleLock。

解决方案 »

  1.   

    那在具体应用时,hmutex和event又有什么区别呢?
      

  2.   

    建立信号灯 互斥量等 ,在多线程里调用WaitForSingleObject,达到同步或互斥。
    互斥量的简单例子,互斥一般就是线程之间的互斥,就是资源的抢占
    HANDLE g_hMutex = NULL;
    g_hMutex = CreateMutex(NULL,FALSE,NULL);
    HANDLE hThread[2];
    hThread[0] = CreateThread(.....);
    hThread[1] = CreateThread(.....);
    ................
    CloseHandle(hThread[0]);
    CloseHandle(hThread[1]);
    CloseHandle(g_hMutex);在线程里:
    DWORD dw=WaitForSigleObject(g_hMutex,INFINITE);
    ............. 
      

  3.   

    先建立一个同步对象信号灯,初始化其最大值如1(跟MUTEX一样),这样只能有一个线程得到资源,在每个线程中用waitforsingleobject获得资源的控制权,可以设定时间或无限等待。
      

  4.   

    WaitForSingleObject本身只是一个等待函数而已,与“互斥”无关。Mutex是互斥对象,Event是事件对象。
    Mutex对象的特点就是,如果一个线程拥有它的话,如果它不释放,别人都无法再占有它,具体到Windows操作系统的实现,就是其他用WaitForSingleObject等待Mutex拥有权的线程全被挂起。
    Event事件的特点就是状态,可以简单的描述为“点亮”,即如果没有人“点亮”一个Event的话,所有用WaitForSingleObject等待Event事件的线程都将被挂起。区别于是就显而易见了:假如同时有n个线程请求Mutex或Event,那么当Mutex被Owner thread释放时,接下来将只有一个线程可能获得Mutex的拥有权,其他线程继续等待;另一方面,如果是一个Event被激发,那么所有等待的线程就都满足条件了(当然,如果Event设定为Auto-Reset就是另一回事了)。此外,Mutex强调“所有权”的概念,它是归某一个线程所有的,这个线程即使在释放Mutex之前调用WaitForSingleObject也不会被阻塞——因为它已经拥有Mutex;同理,没有拥有Mutex的线程即使调用ReleaseMutex也毫无意义。但Event没有这个概念,如果它没有被Set,那么无论是谁,只要调用WaitForSingleObject都会阻塞——这是一个“陷阱”,搞不好就会造成deadlock;反过来,不像ReleaseMutex只能被owner thread调用,SetEvent可以被任何人调用。另外,Windows提供的同步机制还有Critical Section、Samphore等,这些都是操作系统的基本概念,Windows只是一种具体的实现罢了。
      

  5.   

    能不能判断一个mutex在某一个时刻是被那一个线程占用,如果把CreateEvent的第二个残书设为false,那一个占用mutex的线程在结束的时候是不是就会自动的释放这个mutex。还有什么样的操作会使一个mutex成为有信号的。
      

  6.   

    CreateEvent是产生Event对象,不是Mutex。CreateMutex没有BOOL型参数。CreateEvent的第二个参数设置为FALSE的话,Event对象处于Auto-Reset状态,即一旦有一个WaitForSingleObject满足,线程退出等待,但Event对象马上又被置为unsignaled状态,使得其它线程继续等待,这样就实现了“某一时刻只有一个线程可以退出等待”这种效果。一个占有Mutex的线程在退出之前即使没有调用ReleaseMutex,在它结束之后Mutex仍然会被释放,但这时的Mutex处于一种特殊的被释放状态——Abandened,Wait函数会返回WAIT_ABANDONED,但这并不影响以后对Mutex的使用。