在windows系统中,系统本身为我们提供了很多锁。通过这些锁的使用,一方面可以加强我们对锁的认识,另外一方面可以提高代码的性能和健壮性。常用的锁以下四种:临界区,互斥量,信号量,event。

(1)临界区

临界区是最简单的一种锁。基本的临界区操作有,

  1. InitializeCriticalSection
  2. EnterCriticalSection
  3. LeaveCriticalSection
  4. DeleteCriticalSection

如果想要对数据进行互斥操作的话,也很简单,这样做就可以了,

  1. EnterCriticalSection(/*...*/)
  2. do_something();
  3. LeaveCriticalSection(/*...*/)

(2)互斥锁
    互斥锁也是一种锁。和临界区不同的是,它可以被不同进程使用,因为它有名字。同时,获取锁和释放锁的线程必须是同一个线程。常用的互斥锁操作有

  1. CreateMutex
  2. OpenMutex
  3. ReleaseMutex

那么,怎么用互斥锁进行数据的访问呢,其实不难。

  1. WaitForSingleObject(/*...*/);
  2. do_something();
  3. ReleaseMutex(/*...*/);

(3)信号量
  
 信号量是使用的最多的一种锁结果,也是最方便的一种锁。围绕着信号量,人们提出了很多数据互斥访问的方案,pv操作就是其中的一种。如果说互斥锁只能对
单个资源进行保护,那么信号量可以对多个资源进行保护。同时信号量在解锁的时候,可以被另外一个thread进行解锁操作。目前,常用的信号量操作有,

  1. CreateSemaphore
  2. OpenSemaphore
  3. ReleaseSemaphore

信号量的使用和互斥锁差不多。关键是信号量在初始化的时候需要明确当前资源的数量和信号量的初始状态是什么,

  1. WaitForSingleObject(/*...*/);
  2. do_something();
  3. ReleaseSemaphore(/*...*/);

(4)event对象
  
 event对象是windows下面很有趣的一种锁结果。从某种意义上说,它和互斥锁很相近,但是又不一样。因为在thread获得锁的使用权之前,常
常需要main线程调用SetEvent设置一把才可以。关键是,在thread结束之前,我们也不清楚当前thread获得event之后执行到哪了。
所以使用起来,要特别小心。常用的event操作有,

  1. CreateEvent
  2. OpenEvent
  3. PulseEvent
  4. ResetEvent
  5. SetEvent

我们对event的使用习惯于分成main thread和normal thread使用。main
thread负责event的设置和操作,而normal
thread负责event的等待操作。在CreateEvent的时候,要务必考虑清楚event的初始状态和基本属性。
    对于main thread,应该这么做,

  1. CreateEvent(/*...*/);
  2. SetEvent(/*...*/);
  3. WaitForMultiObjects(hThread, /*...*/);
  4. CloseHandle(/*...*/);

对于normal thread来说,操作比较简单,

  1. while(1){
  2. WaitForSingleObject(/*...*/);
  3. /*...*/
  4. }

总结:
    (1)关于临界区互斥区信号量event在msdn上均有示例代码
    (2)一般来说,使用频率上信号量 > 互斥区 > 临界区 > 事件对象
    (3)信号量可以实现其他三种锁的功能,学习上应有所侧重
    (4)纸上得来终觉浅,多实践才能掌握它们之间的区别

多线程的那点儿事(之windows锁)的更多相关文章

  1. ctrl+alt+l:linux 锁屏 win+l:windows锁屏

    ctrl+alt+l:linux 锁屏, system->preferences->screensaver设置锁屏时间 win+l:windows锁屏

  2. “全栈2019”Java多线程第三十章:尝试获取锁tryLock()方法详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  3. 多线程(JDK1.5的新特性互斥锁)

    多线程(JDK1.5的新特性互斥锁)(掌握)1.同步·使用ReentrantLock类的lock()和unlock()方法进行同步2.通信·使用ReentrantLock类的newCondition( ...

  4. Python环境那点儿事(Windows篇)

    Python环境配置那点儿事(Windows篇) 版本选择 (根据你的开发经验选择合适版) 适当版2.7 适当版3.6 适当版3.7 下载链接:python.org 安装 正规的Windows10操作 ...

  5. [并发编程 - 多线程:信号量、死锁与递归锁、时间Event、定时器Timer、线程队列、GIL锁]

    [并发编程 - 多线程:信号量.死锁与递归锁.时间Event.定时器Timer.线程队列.GIL锁] 信号量 信号量Semaphore:管理一个内置的计数器 每当调用acquire()时内置计数器-1 ...

  6. 多线程《五》GIL全局解释器锁

    一 引子 定义: In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple native t ...

  7. 多线程里面的关键字,wait, notfiy, 锁(synchronized), lock接口

    多线程环境下,必须考虑线程同步的问题,这是因为多个线程同时访问变量或者资源时会有线程争用,比如A线程读取了一个变量,B线程也读取了这个变量,然后他们同时对这个变量做了修改,写回到内存中,由于是同时做修 ...

  8. 多线程系列之自己实现一个 lock 锁

    我们面试中经常会被问到多线程相关知识,这一块内容往浅了说大家都会,但是一问到底层实现原理,我们往往就一脸懵逼. 这段时间准备好好学习多线程,接下来会写一系列关于多线程的知识. 我们首先要了解线程,百度 ...

  9. 深入理解多线程(五)—— Java虚拟机的锁优化技术

    本文是<深入理解多线程>的第五篇文章,前面几篇文章中我们从synchronized的实现原理开始,一直介绍到了Monitor的实现原理. 前情提要 通过前面几篇文章,我们已经知道: 1.同 ...

随机推荐

  1. 将子类对象引用赋值给超类对象 JAVA 编译时多态性

    将子类对象引用赋值给超类对象 JAVA 编译时多态性(转) (2012-05-10 11:24:05) 转载▼ 标签: 杂谈 分类: 也无晴_soft 1.通过将子类对象引用赋值给超类对象引用变量来实 ...

  2. [POJ] Palindrome

    Palindrome Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 62102   Accepted: 21643 Desc ...

  3. [OpenCV Qt教程] 在Qt图形界面中显示OpenCV图像的OpenGL Widget(第二部分)

    本文译自:http://www.robot-home.it/blog/en/software/tutorial-opencv-qt-opengl-widget-per-visualizzare-imm ...

  4. Win8电源选项中没有休眠这一项如何让Win8也能够休眠

    我们都知道,Win8默认的电源选项中是没有休眠这一选项的,即使用Alt+F4打开关闭Windows选项窗口也看不到”休眠“.难道Win8就不能够休眠了吗?答案当然不是,我们只要进行一些设置就能让Win ...

  5. java byte to hex

    String str; byte[] bs = null; bs =str.getBytes(); bs =str.getBytes("utf-8") java  byte to ...

  6. GetEnumName 枚举名称 字符串

    System.TypInfo.pas System.TypInfo.hpp http://docwiki.embarcadero.com/Libraries/Tokyo/en/System.TypIn ...

  7. iOS学习之自定义弹出UIPickerView或UIDatePicker(动画效果)

    前面iOS学习之UIPickerView控件的简单使用 用到的UIPickerView弹出来是通过 textField.inputView = selectPicker;   textField.in ...

  8. Mysql合并两列数据

    实例: UPDATE x_yiyuanpinggu_nengli SET ch_yuzhongfangxiang = CONCAT(ch_yuanyuzhong,ch_mubiaoyuzhong) M ...

  9. java aop 日志打印 正则设置

    package tz.lion.Utils.aop; import com.alibaba.fastjson.JSON;import org.springframework.web.multipart ...

  10. Eclipse快捷键大全(补充)

    Ctrl+1 快速修复(最经典的快捷键,就不用多说了) Ctrl+Shift+O 自动导入所需要的包(这个用的次数也相当多)Ctrl+D: 删除当前行 Ctrl+Alt+↓ 复制当前行到下一行(复制增 ...