基于互斥量(Mutex)的线程同步

本文介绍了WindowsAPI中的CreateMutex函数,一种用于创建互斥量以实现线程间对共享资源互斥访问的内核对象。通过示例展示了如何使用CreateMutex来同步线程操作,确保资源的独占访问。
摘要由CSDN通过智能技术生成

      内核对象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;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值