大家好,我遇到个问题,以前没出现过char mutexName[] = "Global\\name_mutex";
void func(string mutexName, bool bOpen)
{
    if (!bOpen){
        SECURITY_DESCRIPTOR sd;
        InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION);
        SetSecurityDescriptorDacl(&sd, TRUE, (PACL) NULL, FALSE);       SECURITY_ATTRIBUTES sa;
       sa.nLength = sizeof(sa);
       sa.lpSecurityDescriptor = &sd;
        sa.bInheritHandle = TRUE;
        mutex = CreateMutex(&sa, false, mutexName.c_str());
        if (NULL == mutex)
       {
   throw "error";
        }    }
    else
    {
mutex = OpenMutex(MUTEX_ALL_ACCESS, false, mutexName.c_str());
if (NULL == mutex)
{
    throw "warnning";
}
    }
}我是在xp系统下,以上代码在一个进程的2个线程里运行。
主线程在等到一个线程调用 func(true);后再调用func(false);
问题:
    出入true的主线程创建了mutex,但主线程传入false,OpenMutex失败,GetLastError 返回2,系统找不到指定的文件。

解决方案 »

  1.   

    对其一下代码char mutexName[] = "Global\\name_mutex"; 
    void func(string mutexName, bool bOpen) 

        if (!bOpen){ 
            SECURITY_DESCRIPTOR sd; 
            InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION); 
            SetSecurityDescriptorDacl(&sd, TRUE, (PACL) NULL, FALSE);         SECURITY_ATTRIBUTES sa; 
            sa.nLength = sizeof(sa); 
            sa.lpSecurityDescriptor = &sd; 
            sa.bInheritHandle = TRUE; 
            mutex = CreateMutex(&sa, false, mutexName.c_str()); 
            if (NULL == mutex) 
            { 
               throw "error"; 
            }     } 
        else 
        { 
            mutex = OpenMutex(MUTEX_ALL_ACCESS, false, mutexName.c_str()); 
            if (NULL == mutex) 
            { 
               throw "warnning"; 
            } 
        } 

      

  2.   

    怀疑bOpen没有初始化!
    在初始化的时候,bOpen=FALSE;
      

  3.   

    不是,怀疑你根本没有创建成功过!另外,建议你跟踪一下,你看看传入的mutexName是否有值!
      

  4.   

    说反了,反正是第一个线程进来 Create 一个mutex 并且成功了
    第二个线程进来调用 OpenMutex 失败了
      

  5.   

    mutexName 有值。
    我是跟踪过了的
      

  6.   

    那是不是哪儿调用了: CloseHandle 关闭了呢?
      

  7.   

    错了,是不是哪儿调用了:ReleaseMutex
      

  8.   

    多谢了,找到问题了,刚才没有认真调试。
    是另外一个线程其他地方出错推出,于是调用西沟函数CloseHandle了