基本介紹
- 中文名:CreateMutex
- 外文名:CreateMutex
- 解釋:創建一個互斥體
- 學科:計算機學
定義簡介,VB聲明,VC聲明,說明,註解,使用例子,創建互斥體,檢查錯誤代碼,詳細例子,
定義簡介
CreateMutex()函式可用來創建一個有名或無名的互斥量對象,其函式原型為:
VB聲明
Declare Function CreateMutex Lib "kernel32" Alias "CreateMutexA" (lpMutexAttributes As SECURITY_ATTRIBUTES, ByVal bInitialOwner As Long, ByVal lpName As String) As Long
VC聲明
HANDLE CreateMutex(
LPSECURITY_ATTRIBUTESlpMutexAttributes, // 指向安全屬性的指針
BOOLbInitialOwner, // 初始化互斥對象的所有者
LPCTSTRlpName // 指向互斥對象名的指針
);
說明
創建一個互斥體(MUTEX)
返回值
Long,如執行成功,就返回互斥體對象的句柄;零表示出錯。會設定GetLastError。如果返回的是一個有效句柄,但指定的名字已經存在,GetLastError也會設為ERROR_ALREADY_EXISTS,bInitialOwner的值將會被忽略。如果調用者限制了許可權,GetLastError將會返回ERROR_ACCESS_DENIED,這個時候應該使用OpenMutex函式。
參數表
參數 類型及說明
lpMutexAttributes SECURITY_ATTRIBUTES,指定一個SECURITY_ATTRIBUTES結構,或傳遞零值(將參數聲明為ByVal As Long,並傳遞零值),表示使用不允許繼承的默認描述符
bInitialOwner BOOL,如創建進程希望立即擁有互斥體,則設為TRUE。一個互斥體同時只能由一個執行緒擁有
lpName String,指定互斥體對象的名字。用vbNullString創建一個未命名的互斥體對象。如已經存在擁有這個名字的一個事件,則打開現有的已命名互斥體。這個名字可能不與現有的事件、信號機、可等待計時器或檔案映射相符
註解
一旦不再需要,注意必須用CloseHandle函式將互斥體句柄關閉。從屬於它的所有句柄都被關閉後,就會刪除對象
執行緒中止前,一定要調用ReleaseMutex釋放互斥體,如不慎未採取這個措施,就會將這個互斥體標記為廢棄(下一個釋放的等待函式會返回WAIT_ABANDONED),並自動釋放所有權。共享這個互斥體的其他應用程式也許仍然能夠用它,但會接收到一個廢棄狀態信息,指出上一個所有進程未能正常關閉。這種狀況是否會造成影響取決於涉及到的具體應用程式。
在Windows系統中,執行緒可以在等待函式中指定一個此執行緒已經擁有的互斥體,由於Windows的防死鎖機制,這種做法不會阻止此執行緒的運行。
使用例子
常用操作mutex的函式還有:ReleaseMutex/OpenMutex/WaitForSingleObject/WaitForMultipleObjects。
創建互斥體
h_mutex1=CreateMutex(NULL,FALSE,"mutex_for_readcount");//創建一個互斥體
檢查錯誤代碼
#include <stdio.h>
#include <windows.h>
...... // main function
HANDLE m_hMutex = CreateMutex(NULL, FALSE, "Sample07");// 檢查錯誤代碼
#include <windows.h>
...... // main function
HANDLE m_hMutex = CreateMutex(NULL, FALSE, "Sample07");// 檢查錯誤代碼
if (GetLastError() == ERROR_ALREADY_EXISTS)
{
// 如果已有互斥量存在則釋放句柄並復位互斥量
CloseHandle(m_hMutex);
m_hMutex = NULL;
// 程式退出
return FALSE;
};
{
// 如果已有互斥量存在則釋放句柄並復位互斥量
CloseHandle(m_hMutex);
m_hMutex = NULL;
// 程式退出
return FALSE;
};
//上面這段代碼演示了有名互斥量在進程互斥中的用法。代碼的核心是CreateMutex()對有名互斥量的創建。
CreateMutex() 用於有獨占要求的程式 (在其進程運行期間不允許其他使用此連線埠設備的程式運行,或不允許同名程式運行)。
詳細例子
下面這段代碼詳細介紹了CreateMutex函式的使用方法:
#include "stdafx.h"#include "windows.h"int main(int argc, char* argv[]){ HANDLE m_hMutex = CreateMutex(NULL,TRUE,"cplusplus_me"); DWORD dwRet = GetLastError(); if (m_hMutex) { if (ERROR_ALREADY_EXISTS == dwRet) { printf("程式已經在運行中了,程式退出!\n"); CloseHandle(m_hMutex); return 0; } } else { printf("創建互斥量錯誤,程式退出!\n"); CloseHandle(m_hMutex); return 0; } while(1) { printf("cplusplus_me\n"); } CloseHandle(m_hMutex); return 0;}