锁
来源:互联网 发布:大学生对网络的利弊 编辑:程序博客网 时间:2024/04/29 14:16
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");elseprintf("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");elseprintf("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);
0 0
- 锁
- 锁
- 锁
- 锁
- 锁
- 锁
- 锁
- 锁
- 锁
- 锁
- 锁
- 锁
- 锁
- 锁
- 锁
- 锁
- 锁
- 锁
- 强制用Wscript.exe或Cscript.exe来运行VBS脚本
- 基于SDN和NFV的下一代网络
- Ubuntu系统中解决Android SDK无法下载Package的问题
- Android ramdisk.img 分析、解压和压缩
- PHP中获取文件扩展名的N种方法
- 锁
- PowerShell 导出SharePoint管理中心解决方案
- 西安力邦智能医疗&可穿戴设备沙龙--第1期---苹果HealthKit、谷歌GoogleFit来袭,智能医疗要爆发吗?
- Android APK反编译详解(附图)
- [LeetCode]Populating Next Right Pointers in Each Node
- POJ 2299 Ultra-QuickSort
- 解决Spring MVC 对AOP不起作用的问题
- com/opensymphony/xwork2/spring/SpringObjectFactory.java:220:-1问题出现的原因及解决办法
- java 加密解密简单实现