在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. Angular2 如何使用jquery

    网上找了很多版本尝试都不行,最后在stackoverflow上找到一个,尝试完美解决 具体操作步骤如下 1. 安装jquery npm install jquery 2.安装 type for jqu ...

  2. php header 302重定向失效问题

    E:\html\pim\php_weili_activities\application\controllers\user.php public function login() { if ($thi ...

  3. Python Tkinter参考资料之(通用控件属性)

    大部分控件的共享选项: 选项(别名) 说明 单位 典型值 没有此属性的控件 background(bg) 当控件显示时,给出的正常颜色 color 'gray25''#ff4400'   border ...

  4. Nginx配置ProxyCache缓存

    利用nginx cache缓存网站数据 nginx本身就有缓存功能,能够缓存静态对象,比如图片.CSS.JS等内容直接缓存到本地,下次访问相同对象时,直接从缓存即可,无需访问后端静态服务器以及存储存储 ...

  5. Numpy的ndarry

    Numpy的ndarry:一种多维数组对象 Numpy最重要的一个特点就是其N维数组对象(即ndarry),该对象是一个快速而灵活的大数据集容器.你可以利用这种数组对整块数据执行一些数学运算,其语法跟 ...

  6. C# 设计模式-单例模式(Singleton)

    所谓单例模式即所谓的一个类只能有一个实例,说白了,也就是类只能在内部实例一次,然后提供这一实例,外部无法对此类实例化. 单例模式的特点: 1.只能有一个实例: 2.只能自己创建自己的唯一实例: 3.必 ...

  7. TRegEx 正则表达式

    TRegEx #include <System.RegularExpressions.hpp> void __fastcall TForm1::Button1Click(TObject * ...

  8. MySQL学习笔记之二---引擎介绍MyISAM VS InnoDB

    前言 MyISAM是MySQL的默认数据库引擎(5.5版之前),由早期的ISAM(Indexed Sequential Access Method:有索引的顺序访问方法)所改良.虽然性能极佳,但却有一 ...

  9. nginx-rtmp-module--------------WIKI

    https://github.com/arut/nginx-rtmp-module/wiki/Directives#idle_streams ============================= ...

  10. 整理SSH框架的优缺点

    Hibernate优点(1) 对象/关系数据库映射(ORM)它使用时只需要操纵对象,使开发更对象化,抛弃了数据库中心的思想,完全的面向对象思想(2) 透明持久化(persistent)带有持久化状态的 ...