其实要实现我的目的,只要用Sleep(1000)这条语句就可以了,这里之所以要限定用WaitForSingleObject函数,是因为我想弄明白如何用互斥量使WaitForSingleObject进入“无信号”的等待状态。我的代码如下:
HANDLE hMutex = CreateMutex(0,0,0);
DWORD dwWaitResult = WaitForSingleObject(hMutex, 1000L);
上面代码只要让返回值dwWaitResult为WAIT_TIMEOUT就可以实现延时的目的了,可它总是返回WAIT_OBJECT_0,请问要如何改才能实现我的目的呢?注意:是在单线程下。请大家指点一下!

解决方案 »

  1.   

    HANDLE hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
    DWORD dwWaitResult = WaitForSingleObject(hEvent , 1000L); 
      

  2.   

    单线程用mutex不行,除非在另一个进程里Create拥有,然后在这个进程里openmutex
    否则就用event
      

  3.   

    楼主你的Mutex才刚创建就给线程去锁肯定能过的,因为这个时候Mutex是自由的。你可以让主线程去创建Mutex,然后主线程先马上获得这个锁,WaitForSingleObject(hMutex, 1000L); 主线程不放锁的情况下然后再让工作线程去WaitForSingleObject(hMutex, 1000L); 就停住了。
      

  4.   

    看了诸位的指点后,我研究了半天,仍有些困惑,就写了如下测试代码:
    ----------------------
    HANDLE g_hMutex = NULL;
    char g_cArray[11] = {0};UINT ThreadProc1(LPVOID pParam)
    {
    // 等待互斥对象通知
    WaitForSingleObject(g_hMutex, INFINITE);
    // 对共享资源进行写入操作
    for (int i = 0; i < 10; i++)
    {
    g_cArray[i] = 'a';
    Sleep(40);
    }
    // 释放互斥对象
    //ReleaseMutex(g_hMutex);
    return 0;
    }UINT ThreadProc2(LPVOID pParam)
    {
    WaitForSingleObject(g_hMutex, INFINITE);
    // 对共享资源进行写入操作
    for (int i = 0; i < 10; i++)
    {
    g_cArray[i] = 'b';
    Sleep(4); //增加访问冲突的机会
    }
    // 释放互斥对象
    //ReleaseMutex(g_hMutex);
    return 0;
    }UINT ThreadProc3(LPVOID pParam)
    {
    WaitForSingleObject(g_hMutex, INFINITE);
    AfxMessageBox(g_cArray);
    // 释放互斥对象
    //ReleaseMutex(g_hMutex);
    return 0;
    }void CTestDlg::OnOK() 
    {
    memset(g_cArray, 0, 11);
    // 创建互斥对象
    g_hMutex = CreateMutex(NULL, FALSE, NULL);
    // 启动各线程
    AfxBeginThread(ThreadProc1, NULL);
    AfxBeginThread(ThreadProc2, NULL);
    AfxBeginThread(ThreadProc3, NULL);
    }
    ----------------------
    上面代码共有3个线程,为了增加访问冲突的可能,线程1慢吞吞地对指定内存进行写入;线程2也同样对该内容进行写操作;线程3则是等他们都进行完了后,显示一下最后的结果的。
    我的疑问是:WaitForSingleObject函数难道除了等待互斥量的信号外(互斥量被其他线程锁住时),如果互斥量是自由的话,还能够顺手把它给锁住不成?另外,上面代码中ReleaseMutex这行代码,为什么要不要它都不影响最终结果的正确性?不要这行的话会不会有什么隐患?
      

  5.   


    1. WaitForSingleObject获取互斥量成功后会锁住互斥量
    2. ReleaseMutex这行代码,它不影响最终结果的正确性的原因是线程马上结束了。如果线程结束系统会自动释放其拥有的互斥量的所有权的。不要这行的话,如果线程由于某种原因挂起的话,其他线程再也拿不到互斥量的所有权了。
      

  6.   

    WaitForSingleObject 理解成排队等候(等候也可以理解为排队申请).
    CreateMutex BOOL bInitialOwner 这参数取值 False 时, 第一个执行的线程将会最先拥有互斥对象, 一旦拥有其他线程就得等待
    第2个问题,楼上说的很详细了