1.自动锁

#ifndef AUTO_LOCK_H
#define AUTO_LOCK_H

#include "defines.h"

class AutoLock
{
public:
	AutoLock(HANDLE &mtx) : mutex(mtx)
	{
		WaitForSingleObject(mutex, INFINITE);
	}

	~AutoLock()
	{
		ReleaseMutex(mutex);
	}

private:
	HANDLE &mutex;
};

#endif

2. Mutex Object 

使用mutex的目的:

        防止不同的线程进入临界区,确保同一时间只有一个线程进入临界区

mutex作用对象:

        同一进程的多个线程,不同进程的线程


2.1 Mutex重复持有问题

总结:

        1.线程A内的代码可以多次申请同一把锁,且每次均可获得

        2.A只有释放相同次数,才可真正解锁。该锁才可被其它线程获得

综上所述:

自动锁的使用中下述情况正确:

void AutoLockInsideFunc()
{
	AutoLock lock(mutex);
	....
}

void Fxx()
{
	AutoLock lock(mutex);
	AutoLockInsideFunc();
	....
}

一言以蔽之:mutex重复持有没有问题


2.2 Mutex Object与Critical Section Object区别

Critical Section Object:适用于同一进程的不同线程间同步。

Mutex Object:适用于同一进程的不同线程和不同进程的线程间同步。


2.3 Mutex Object进程同步示例

创建全局Session命名空间mutex对象

HANDLE mutex = CreateMutex(NULL,  false, "Global\Mutex");

if(!mutex)
{
	printf("CreateMutex == NULL, ErrorCode=%d
", GetLastError());
	return false;
}

if(GetLastError() == ERROR_ALREADY_EXISTS)
	printf("Mutex Global\Mutex Already Exist
");

进程A,QQ.exe

HANDLE h = OpenMutex(MUTEX_ALL_ACCESS, false, "Global\Mutex");
if(!h)
{
	if(GetLastError() == ERROR_FILE_NOT_FOUND)
		printf("Mutex Global\Mutex Not Exist
");
	else
		printf("OpenMutex == NULL, ErrorCode=%d
", GetLastError());
	return false;
}

WaitForSingleObject(h, INFINITE);
//
ReleaseMutex(h);

CloseHandle(h);

进程B,VMSClient.exe

HANDLE h = OpenMutex(MUTEX_ALL_ACCESS, false, "Global\Mutex");
if(!h)
{
	if(GetLastError() == ERROR_FILE_NOT_FOUND)
		printf("Mutex Global\Mutex Not Exist
");
	else
		printf("OpenMutex == NULL, ErrorCode=%d
", GetLastError());
	return false;
}

WaitForSingleObject(h, INFINITE);
//
ReleaseMutex(h);

CloseHandle(h);
进程退出,系统自动关闭HANDLE当最后一个HANDLE被关闭,Mutex Object会被销毁


3. 互锁函数

举例:InterlockedIncrement, InterlockedDecrement, InterlockedAdd, InterlockedDecrement...

功能:防止多余一条线程同时访问同一个变量,如果变量在共享内存中,不同进程的线程也能使用这种方法。

注意:InterlockedIncrement参数有时32位long,有时64位long long,而参数类型错问题严重。现统一InterlockedIncrement64。

标准方式:

LONG64 l = 0;
InterlockedIncrement64(&l);


原文地址:https://www.cnblogs.com/chaikefusibushiji/p/7475626.html