• 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);


  • 相关阅读:
    git添加文件的原理流程
    maven复制包error
    一行代码-Js简单消息弹框
    WEB-给自己所有的域名加上HTTPS
    记录-配置文件-将网站协议从 HTTP 升级为 HTTPS (基于 Nginx 配置)
    记录-Mac终端自动补全的配置(解决不能输入大写T的问题)
    记录-Navicat连接MySQL8.0出现2059错误
    记录-MySQL 修改ROOT密码
    记录-Maven的安装与配置
    简单使用TensorFlow.js在浏览器进行视频实时目标识别(基于YOLO V3)
  • 原文地址:https://www.cnblogs.com/chaikefusibushiji/p/7475626.html
Copyright © 2020-2023  润新知