锁
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\n", GetLastError());
return false;
}
if(GetLastError() == ERROR_ALREADY_EXISTS)
printf("Mutex Global\\Mutex Already Exist\n");
进程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\n");
else
printf("OpenMutex == NULL, ErrorCode=%d\n", 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\n");
else
printf("OpenMutex == NULL, ErrorCode=%d\n", 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);
浙公网安备 33010602011771号