CreateMutex

【勇芳软件工作室】汉化HomePreviousNext

CreateMutex函数创建一个命名或未命名的互斥对象。

手柄CreateMutex(

LPSECURITY_ATTRIBUTES 【lpMutexAttributes】,//指向安全属性的指针
BOOL 【bInitialOwner】,//标志初始所有权
LPCTSTR 【lpName】//指向mutex对象名称的指针
); 

参数

【lpMutexAttributes】

指向SECURITY_ATTRIBUTES结构的指针,用于确定返回的句柄是否可以由子进程继承。如果【lpMutexAttributes】为NULL,则无法继承句柄。

Windows NT:结构的lpSecurityDescriptor成员指定了新的互斥体的安全描述符。如果【lpMutexAttributes】为NULL,则互斥体将获取默认安全描述符。

Windows 95:结构的lpSecurityDescriptor成员将被忽略。

【bInitialOwner】

指定互斥体对象的初始所有者。如果为TRUE,则调用线程请求立即拥有互斥体对象。否则,互斥体不是所有。

【lpName】

指向一个以null结束的字符串,指定互斥体对象的名称。该名称仅限于MAX_PATH个字符,并且可以包含除反斜杠路径分隔符(\\)之外的任何字符。名称比较区分大小写。

如果【lpName】匹配现有的命名互斥对象的名称,则此函数将请求对现有对象的MUTEX_ALL_ACCESS访问。在这种情况下,【bInitialOwner】参数被忽略,因为它已经被创建过程设置了。如果【lpMutexAttributes】参数不为NULL,则它确定句柄是否可以继承,但其安全描述符成员将被忽略。

如果【lpName】为NULL,则会创建互斥体对象,而不使用名称。

如果【lpName】匹配现有事件,信号量或文件映射对象的名称,则该函数将失败,并且GetLastError函数返回ERROR_INVALID_HANDLE。这是因为事件,互斥体,信号量和文件映射对象共享相同的名称空间。

返回值

如果函数成功,则返回值是互斥体对象的句柄。如果在函数调用之前存在命名的互斥对象,则GetLastError函数返回ERROR_ALREADY_EXISTS。否则,GetLastError返回零。

如果函数失败,返回值为NULL。要获取扩展错误信息,请调用GetLastError.

备注

CreateMutex返回的句柄对新的互斥对象具有MUTEX_ALL_ACCESS访问权限,可用于需要对互斥体对象处理的任何函数。

调用进程的任何线程可以在调用其中一个等待功能时指定互斥体对象句柄。当指定对象的状态发出信号时,单个对象等待函数返回。可以指示多对象等待功能在任何一个或所有指定对象发出信号时返回。当wait函数返回时,等待的线程被释放以继续执行。

当互斥体对象的状态不被任何线程所拥有时,将被发出信号。创建线程可以使用【bInitialOwner】标志来请求立即拥有互斥体。否则,线程必须使用其中一个等待函数来请求所有权。当互斥体的状态发出信号时,一个等待线程被授予所有权,互斥体的状态更改为非信号,等待函数返回。任何给定时间只有一个线程可以拥有互斥体。拥有的线程使用ReleaseMutex函数来释放其所有权。

拥有互斥体的线程可以在重复的等待函数调用中指定相同的互斥体,而不会阻止其执行。通常,您不会重复等待相同的互斥体,但是这种机制可以防止线程在等待已拥有的互斥锁时自身死锁。但是,要释放其所有权,线程必须在每次互斥满足等待时调用ReleaseMutex一次。

两个或多个进程可以调用CreateMutex创建相同的命名互斥体。第一个进程实际上创建了互斥体,后续进程打开了现有互斥体的句柄。这使得多个进程能够获得相同互斥体的处理,同时减轻用户有责任确保首先启动创建过程。使用此技术时,应将【bInitialOwner】标志设置为FALSE;否则,很难确定哪个过程具有初始所有权。

多个进程可以具有相同互斥对象的句柄,从而使对象能够进行进程间同步。以下对象共享机制可用:

*如果CreateMutex参数CreateMutex启用继承,则由CreateProcess函数创建的子进程可以继承互斥对象的句柄。

*进程可以在调用DuplicateHandle函数时指定mutex对象句柄,以创建可由另一进程使用的重复句柄。

*进程可以在调用OpenMutexCreateMutex函数时指定互斥体对象的名称。

使用CloseHandle功能关闭句柄。当过程终止时,系统自动关闭句柄。互斥体对象在最后一个句柄被关闭时被销毁。

也可以看看

CloseHandle, CreateProcess, DuplicateHandle, OpenMutex, ReleaseMutex, SECURITY_ATTRIBUTES