内核对象Mutex,也称为互斥量,是一种非常有效的内核对象,主要用于实现内核中的互斥访问功能。它能够确保多个线程对同一共享资源的互斥访问,即同一时间只能有一个任务持有互斥锁,并且只有这个任务可以对互斥锁进行解锁。
CreateMutex是一个Windows API函数,用于创建一个互斥量(mutex)对象。互斥量通常用于同步线程对共享资源的访问,确保在任意时刻只有一个线程可以访问该资源。CreateMutex函数的具体用法如下:
CreateMutex函数的原型是:
HANDLE CreateMutex(LPSECURITY_ATTRIBUTES lpMutexAttributes, BOOL bInitialOwner, LPCTSTR lpName);
其中参数的含义如下:
lpMutexAttributes
:一个指向SECURITY_ATTRIBUTES结构的指针,该结构决定了返回的句柄是否可以被子进程继承,以及返回的句柄的安全描述符。如果此参数为NULL,那么句柄将不会被继承,并且会使用默认的安全描述符。bInitialOwner
:指定互斥体的初始所有者。如果这个值是TRUE,调用线程将获得互斥体的初始所有权。如果这个值是FALSE,调用线程不会获得互斥体的所有权。lpName
:互斥体的名称。如果此参数为NULL,那么创建的互斥体将是匿名的。如果指定了名称,那么可以在不同的进程之间共享这个互斥体。
使用示例:
#include <stdio.h>
#include <windows.h>
#include <process.h>
#define NUM_THREAD 50
unsigned WINAPI threadInc(void * arg);
unsigned WINAPI threadDes(void * arg);
long long num=0;
HANDLE hMutex;
int main(int argc, char *argv[])
{
HANDLE tHandles[NUM_THREAD];
int i;
hMutex=CreateMutex(NULL, FALSE, NULL);
for(i=0; i<NUM_THREAD; i++)
{
if(i%2)
tHandles[i]=(HANDLE)_beginthreadex(NULL, 0, threadInc, NULL, 0, NULL);
else
tHandles[i]=(HANDLE)_beginthreadex(NULL, 0, threadDes, NULL, 0, NULL);
}
WaitForMultipleObjects(NUM_THREAD, tHandles, TRUE, INFINITE);
CloseHandle(hMutex);
printf("result: %lld \n", num);
return 0;
}
unsigned WINAPI threadInc(void * arg)
{
int i;
WaitForSingleObject(hMutex, INFINITE);
for(i=0; i<50000000; i++)
num+=1;
ReleaseMutex(hMutex);
return 0;
}
unsigned WINAPI threadDes(void * arg)
{
int i;
WaitForSingleObject(hMutex, INFINITE);
for(i=0; i<50000000; i++)
num-=1;
ReleaseMutex(hMutex);
return 0;
}