Mutex — Windows API

Mutex是互斥体的意思,当一个线程持有一个Mutex时,其它线程申请持有同一个Mutex会被阻塞,因此可以通过Mutex来保证对某一资源的互斥访问(即同一时间最多只有一个线程访问)。
调用CreateMutex可以创建或打开一个Mutex对象,其原型如下

HANDLE CreateMutex(
    LPSECURITY_ATTRIBUTES lpMutexAttributes,
    BOOL bInitialOwner,
    LPCTSTR lpName
);

其中参数lpMutexAttributes用来设定Mutex对象的安全描述符和是否允许子进程继承句柄。bInitialOwner表明是否将Mutex的持有者设置为调用线程。lpName参数设置Mutex的名字,该名字区分大小写并不能包含"\",最大长度为MAX_PATH,可设置为NULL表明该Mutex为匿名对象。

如果调用成功,则返回Mutex的句柄,否则返回NULL,如果lpName不为NULL且调用前同名的Mutex已被创建,则返回同名Mutex的句柄,此时调用GetLastError将返回ERROR_ALREADY_EXISTS,参数bInitialOwner将被忽略。

还可以调用OpenMutex打开创建的非匿名Mutex,原型如下

HANDLE OpenMutex(
    DWORD dwDesiredAccess,
    BOOL bInheritHandle,
    LPCTSTR lpName
);

在成功创建或打开Mutex后,可以使用wait functions来等待并获取Mutex的持有权。

下面的例子用来通过Mutex对象控制某一应用程序只运行一次

int main(int argc, const char* argv[]) {
    HANDLE hMutex = CreateMutex(NULL, FALSE, "Mutex_Only_One_Instance_Allowed");
    if (NULL == hMutex) {
        Error("Create mutex error.");
        return -1;
    }
    DWORD dw = WaitForSingleObject(hMutex, 0);
    if (WAIT_FAILED == dw) {
        Error("Wait for mutex error.");
        CloseHandle(hMutex); // 释放句柄,当指向同一系统对象的所有句柄释放后,该对象将被删除。
        return -1;
    } else if (WAIT_TIMEOUT == dw) {
        // 另外一个实例正在运行
        CloseHandle(hMutex);
        return 1;
    }
    
    // 没有其它实例在运行,本实例将继续运行
    // 在此实现必要的功能性代码,如创建窗口,进入消息循环
    // ...............

    ReleaseMutex(hMutex); // 释放hMutex的持有权,注意这并不等同于删除Mutex对象
    CloseHandle(hMutex);

    return 0;
}

其中WaitForSingleObject是等待特定对象发出信号(signaled),而Mutex对象在没有任何线程持有时会发出信号。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值