线程同步的方式和机制

临界区、互斥区、事件、信号量四种方式

临界区(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相关推荐

  1. Go 学习笔记(66)— Go 并发同步原语(sync.Mutex、sync.RWMutex、sync.Once)

    1. 竞态条件 一旦数据被多个线程共享,那么就很可能会产生争用和冲突的情况.这种情况也被称为竞态条件(race condition),这往往会破坏共享数据的一致性. 举个例子,同时有多个线程连续向同一 ...

  2. Go 学习笔记(23)— 并发(02)[竞争,锁资源,原子函数sync/atomic、互斥锁sync.Mutex]

    本文参考 <Go 语言实战> 1. 竞争状态简述 如果两个或者多个 goroutine 在没有互相同步的情况下,访问某个共享的资源,并试图同时读和写这个资源,就处于相互竞争的状态,这种情况 ...

  3. C++多线程:互斥变量 std::mutex

    文章目录 描述 成员函数 总结 描述 头文件 <mutex> 使用 std::mutex <variable> 简介 mutex是一种多线程变成中的同步原语,它能够让共享数据不 ...

  4. C#中使用Monitor类、Lock和Mutex类来同步多线程的执行(转)

    C#中使用Monitor类.Lock和Mutex类来同步多线程的执行 在多线程中,为了使数据保持一致性必须要对数据或是访问数据的函数加锁,在数据库中这是很常见的,但是在程序中由于大部分都是单线程的程序 ...

  5. Oracle Mutex 机制 说明

    之前也整理过一篇文章来说明Oracle Lock的,参考: 锁 死锁 阻塞 Latch 等待 详解 http://blog.csdn.net/tianlesoftware/archive/2010/0 ...

  6. 对于sync.Mutex使用注意事项

    1.sync.Mutex的初始化注意事项 type MemProvider struct { lock     *sync.Mutex              //用来锁 sessions map[ ...

  7. 《ASCE1885的源码分析》の跨平台互斥对象Mutex封装类

    1)首先定义互斥对象的接口IMutex(所在文件是IMutex.h) class IMutex   //抽象接口 { public: virtual ~IMutex() {} virtual void ...

  8. [一个经典的多线程同步问题]解决方案三:互斥量Mutex

    本篇通过互斥量来解决线程的同步,学习其中的一些知识. 互斥量也是一个内核对象,它用来确保一个线程独占一个资源的访问.互斥量与关键段的行为非常相似,并且互斥量可以用于不同进程中的线程互斥访问资源.使用互 ...

  9. 让Vagrant在Windwos下支持使用NFS/SMB共享文件夹从而解决目录共享IO缓慢的问题

    此问题是在拥有相同配置的环境中,项目在win10跑的慢而在win7就正常的情况下发现的,一步步调试之后发现是文件操作的相关行为变的很慢,于是考虑到可能是系统问题,后来在如下链接找到了解决办法:http ...

  10. 【转】windows平台多线程同步之Mutex的应用

    线程组成: 线程的内核对象,操作系统用来管理该线程的数据结构. 线程堆栈,它用于维护线程在执行代码时需要的所有参数和局部变量.   操作系统为每一个运行线程安排一定的CPU时间 -- 时间片.系统通过 ...

最新文章

  1. 昆仑通态通用版找不到驱动_2021深圳新安西门子伺服驱动电机回收合作共赢
  2. 一个快速、高效的Levenshtein算法实现
  3. 关于Unity中NGUI的Pivot和锚点
  4. 地面控制点的定义与作用_什么是地面塌陷
  5. mes二次开发可以用c++吗_可以用水洗单反镜头吗
  6. kmp算法next计算方法_KMP 算法详解
  7. 【原】浅谈KL散度(相对熵)在用户画像中的应用
  8. 即时通讯工具:Output Messenger Server
  9. 只要一行代码,批量将Word转换为PDF!
  10. Sketch for Mac(矢量绘图工具)
  11. 腾讯笔试题——java题总结无答案
  12. 转DICOM学习笔记
  13. 清华计算机徐华简介,徐华
  14. 使用阿里云服务器搭建个人博客
  15. Java与JS金额计算去掉小数部分的方法
  16. NPN三极管放大原理
  17. 主成分回归的r语言代码
  18. python爬虫第二弹-多线程爬取网站歌曲
  19. 个人关于web开发浅尝辄止,web开发概览
  20. OSS brower js SDK

热门文章

  1. 关于计算机的知识古人,世界仅是一串二进制编码?我们是虚拟的?古人早就给出了答案...
  2. ios 添加block 类别_ios block是什么数据类型?
  3. 带头结点的单链表的插入删除和遍历操作
  4. 2019-02-26-GCN介绍
  5. 深度学习论文和开源代码
  6. python 基于滑动平均思想实现缺失数据填充
  7. Javascript内置对象之Date对象与HTML BOM
  8. go mysql stmt exec_Go语言操作MySQL
  9. SpringMVC学习(六)处理乱码问题
  10. 基于springboot的物资管理系统