windwos::mutex
线程同步的方式和机制
临界区、互斥区、事件、信号量四种方式
临界区(Critical Section)、互斥量(Mutex)、信号量(Semaphore)、事件(Event)的区别
1、临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。在任意时刻只允许一个线程对共享资源进行访问,如果有多个线程试图访问公共资源,那么在有一个线程进入后,其他试图访问公共资源的线程将被挂起,并一直等到进入临界区的线程离开,临界区在被释放后,其他线程才可以抢占。
2、互斥量:采用互斥对象机制。 只有拥有互斥对象的线程才有访问公共资源的权限,因为互斥对象只有一个,所以能保证公共资源不会同时被多个线程访问。互斥不仅能实现同一应用程序的公共资源安全共享,还能实现不同应用程序的公共资源安全共享
3、信号量:它允许多个线程在同一时刻访问同一资源,但是需要限制在同一时刻访问此资源的最大线程数目
4、事 件: 通过通知操作的方式来保持线程的同步,还可以方便实现对多个线程的优先级比较的操作
在这里我们要讲的互斥锁,像一个物件,这个物件只能同时被一个线程持有。如此一来,便可以通过互斥锁来实现线程的同步
一、创建
创建互斥锁的方法是调用函数CreateMutex:
CreateMutex(&sa, bInitialOwner, szName);第一个参数是一个指向SECURITY_ATTRIBUTES结构体的指针,一般的情况下,可以是nullptr。
第二个参数类型为BOOL,表示互斥锁创建出来后是否被当前线程持有。
第三个参数类型为字符串(const TCHAR*),是这个互斥锁的名字,如果是nullptr,则互斥锁是匿名的。
例:
HANDLE hMutex = CreateMutex(nullptr, FALSE, nullptr);上面的代码创建了一个匿名的互斥锁,创建出来后,当前线程不持有这个互斥锁。
二、持有
WaitForSingleObject函数可以让一个线程持有互斥锁。用法:
WaitForSingleObject(hMutex, dwTimeout);这个函数的作用比较多。这里只介绍第一个参数为互斥锁句柄时的作用。
它的作用是等待,直到一定时间之后,或者,其他线程均不持有hMutex。第二个参数是等待的时间(单位:毫秒),如果该参数为INFINITE,则该函数会一直等待下去。
三、释放
用ReleaseMutex函数可以让当前线程“放开”一个互斥锁(不持有它了),以便让其他线程可以持有它。用法
ReleaseMutex(hMutex);
四、销毁
当程序不再需要互斥锁时,要销毁它。
CloseHandle(hMutex);
五、命名互斥锁
如果CreateMutex函数的第三个参数传入一个字符串,那么所创建的锁就是命名的。当一个命名的锁被创建出来以后,当前进程和其他进程如果试图创建相同名字的锁,CreateMutex会返回原来那把锁的句柄,并且GetLastError函数会返回ERROR_ALREADY_EXISTS。这个特点可以使一个程序在同一时刻最多运行一个实例。
BOOL CDemoDlg::OnInitDialog()
{
HANDLE hMutex = CreateMutex(nullptr, FALSE, "Demo");
if (GetLastError() == ERROR_ALREADY_EXISTS) // 已经有了一个实例
{
MessageBox("只能有一个应用程序在运行!","Demo");
exit(0);
}
// 其他代码
return TRUE;
转载于:https://www.cnblogs.com/ohyb/p/9378044.html
windwos::mutex相关推荐
- Go 学习笔记(66)— Go 并发同步原语(sync.Mutex、sync.RWMutex、sync.Once)
1. 竞态条件 一旦数据被多个线程共享,那么就很可能会产生争用和冲突的情况.这种情况也被称为竞态条件(race condition),这往往会破坏共享数据的一致性. 举个例子,同时有多个线程连续向同一 ...
- Go 学习笔记(23)— 并发(02)[竞争,锁资源,原子函数sync/atomic、互斥锁sync.Mutex]
本文参考 <Go 语言实战> 1. 竞争状态简述 如果两个或者多个 goroutine 在没有互相同步的情况下,访问某个共享的资源,并试图同时读和写这个资源,就处于相互竞争的状态,这种情况 ...
- C++多线程:互斥变量 std::mutex
文章目录 描述 成员函数 总结 描述 头文件 <mutex> 使用 std::mutex <variable> 简介 mutex是一种多线程变成中的同步原语,它能够让共享数据不 ...
- C#中使用Monitor类、Lock和Mutex类来同步多线程的执行(转)
C#中使用Monitor类.Lock和Mutex类来同步多线程的执行 在多线程中,为了使数据保持一致性必须要对数据或是访问数据的函数加锁,在数据库中这是很常见的,但是在程序中由于大部分都是单线程的程序 ...
- Oracle Mutex 机制 说明
之前也整理过一篇文章来说明Oracle Lock的,参考: 锁 死锁 阻塞 Latch 等待 详解 http://blog.csdn.net/tianlesoftware/archive/2010/0 ...
- 对于sync.Mutex使用注意事项
1.sync.Mutex的初始化注意事项 type MemProvider struct { lock *sync.Mutex //用来锁 sessions map[ ...
- 《ASCE1885的源码分析》の跨平台互斥对象Mutex封装类
1)首先定义互斥对象的接口IMutex(所在文件是IMutex.h) class IMutex //抽象接口 { public: virtual ~IMutex() {} virtual void ...
- [一个经典的多线程同步问题]解决方案三:互斥量Mutex
本篇通过互斥量来解决线程的同步,学习其中的一些知识. 互斥量也是一个内核对象,它用来确保一个线程独占一个资源的访问.互斥量与关键段的行为非常相似,并且互斥量可以用于不同进程中的线程互斥访问资源.使用互 ...
- 让Vagrant在Windwos下支持使用NFS/SMB共享文件夹从而解决目录共享IO缓慢的问题
此问题是在拥有相同配置的环境中,项目在win10跑的慢而在win7就正常的情况下发现的,一步步调试之后发现是文件操作的相关行为变的很慢,于是考虑到可能是系统问题,后来在如下链接找到了解决办法:http ...
- 【转】windows平台多线程同步之Mutex的应用
线程组成: 线程的内核对象,操作系统用来管理该线程的数据结构. 线程堆栈,它用于维护线程在执行代码时需要的所有参数和局部变量. 操作系统为每一个运行线程安排一定的CPU时间 -- 时间片.系统通过 ...
最新文章
- 昆仑通态通用版找不到驱动_2021深圳新安西门子伺服驱动电机回收合作共赢
- 一个快速、高效的Levenshtein算法实现
- 关于Unity中NGUI的Pivot和锚点
- 地面控制点的定义与作用_什么是地面塌陷
- mes二次开发可以用c++吗_可以用水洗单反镜头吗
- kmp算法next计算方法_KMP 算法详解
- 【原】浅谈KL散度(相对熵)在用户画像中的应用
- 即时通讯工具:Output Messenger Server
- 只要一行代码,批量将Word转换为PDF!
- Sketch for Mac(矢量绘图工具)
- 腾讯笔试题——java题总结无答案
- 转DICOM学习笔记
- 清华计算机徐华简介,徐华
- 使用阿里云服务器搭建个人博客
- Java与JS金额计算去掉小数部分的方法
- NPN三极管放大原理
- 主成分回归的r语言代码
- python爬虫第二弹-多线程爬取网站歌曲
- 个人关于web开发浅尝辄止,web开发概览
- OSS brower js SDK