#include <iostream>
#include <Windows.h>
#include <tchar.h>
using namespace std;DWORD WINAPI ThreadProc(LPVOID lpParameter);
HANDLE hMultex;
int main()
{
HANDLE handle1;
handle1 = CreateThread(NULL,0,ThreadProc,0,NULL,0);
CloseHandle(handle1);

hMultex = CreateMutex(NULL,true,_T("aaaaaaaaaaa")); if((hMultex!=NULL)&&GetLastError() == ERROR_ALREADY_EXISTS)
{
cout << "Only one instance can run !" << endl;
return 0;
}
ReleaseMutex(hMultex);
Sleep(1000);
}DWORD WINAPI ThreadProc(LPVOID lpParameter)
{
while(true)
{
WaitForSingleObject(hMultex,INFINITE);
cout << "Test!" << endl;
ReleaseMutex(hMultex);
}
return 0;
}
vs2008 用互斥对象保证一个实例为什么总是不行?

解决方案 »

  1.   

    用线程干嘛啊?CreateMutex  即可了 带有名字的 
      

  2.   

    ReleaseMutex(hMultex);
    都释放了,还能检测到同名的吗?
      

  3.   


    hMultex = CreateMutex(NULL,true,_T("aaaaaaaaaaa")); 中间参数为true
      

  4.   


    hMultex = CreateMutex(NULL,true,_T("aaaaaaaaaaa")); 后面也有名字
      

  5.   

    实践证明是可以的。#include <iostream>
    #include <Windows.h>
    #include <tchar.h>
    using namespace std;HANDLE hMultex;
    int main()
    {
        hMultex = CreateMutex(NULL,true,_T("aaaaaaaaaaa"));    if((hMultex!=NULL)&&GetLastError() == ERROR_ALREADY_EXISTS)
        {
            cout << "Only one instance can run !" << endl;
            return 0;
        }
        ReleaseMutex(hMultex);
        while(true)
        {
            Sleep(100);
        }
    }
      

  6.   

    Mutex是全局的,不需要线程,主要是你不要Release它。下次创建同名CreateMutex会失败,就互斥了。
      

  7.   

    #include <iostream>
    #include <Windows.h>
    #include <tchar.h>
    using namespace std;DWORD WINAPI ThreadProc(LPVOID lpParameter);
    HANDLE hMultex;
    int main()
    {
        while(true){
    hMultex = CreateMutex(NULL,true,_T("AABBCC"));

    if((hMultex!=NULL)&&GetLastError() == ERROR_ALREADY_EXISTS)
    {
    cout << "Only one instance can run !" << endl;
    return 0;
    }else{
    Sleep(1000);
    cout << "Create Success!" << endl;
    }
    }
    }我这个逻辑比你的好理解
      

  8.   

    上面的代码没有问题,可以保证只有一个实例。不过,这么写确实不太好试验,sleep太短了,来不及开另一个进程,前一个就结束了,看不出来试验效果。
      

  9.   

    lz的代码逻辑思路不是很清晰
    应该先创建mutex,在创建线程
    然后main要等到线程结束才释放hMutex