什么是内核?windows操作系统为了更好的管理进程,线程,创建了很多数据结构,这些数据结构运行在windows的底层,并不开放给开发人员;所以开发人员称这些结构为内核,但是为了开发人员能够使用,windows将内核封装为句柄并开放,所以句柄就是指向内核数据结构的一个程序员可以使用的对象。

我们前面所说的用户模式下的线程同步有一个缺点,就是不能夸进程来实现同步:比如QQ进程在启动的时候需要启动一个QQ密码保护进程,这种问题就需要通过内核模式下的线程同步。

前面所说,同步问题就是A等B的问题,如何让线程A等待,在内核模式下有如下方式

WaitForSingleObject(HANDLE hobject,DWORD waittime)

等待一个对象

WaitFormULTIPLEObjects(

dword DWcOUNT  //等待多少个内核对象

HANDLE* hobjectS   //是哪些?

BOOL waitAll,     //是否等待所有

DWORD waittime)

等待多个对象

WaitForInputIdle(HANDLE hProcess ,DWORD waittime)

等到hProcess所指定的进程处理完所有的消息

MSGwaitForMultipleObjects(Ex)

等待多个对象,或者当指定的内核对象所代表的线程中有消息进入

WaitForDebugEvent

等待被调试的线程发生某个事件时(比如运行到断点,程序结束等)

SignalObjectandWait(

Handle hObjectToSignal

HANDLE hobectTowaitOn,

DWORD waittime

BOOL alertable)

等待hobectTowaitOn对象,并在同时让hObjectToSignal触发【该操作是一个原子操作】

线程A要等到什么时候呢?

1.时间到:每一个等待函数都会制定一个等待时间,当时间一到,线程就醒来,继续执行。

【这个时间可以设置为INFINITE表示线程A要等到永远,直到事件触发】

2.事件触发:人们等待通常是等到某个事件发生。比如:屌丝男要等到女神回心转意,才肯婚娶;

玩家2要等到花儿也谢了才出牌;哲学家3要等到明白宇宙究竟是由哪种元素组成才肯闭眼。

在windows中,内核对象的数据结构有一个标志用来表示内核所表示的事件是否发生:如果事件发生,我们叫触发,如果没有发生,我们叫该对象未触发。下面就来看一下这些内核对象所表示的事件

内核对象 触发  
进程 结束进程 进程的结束
线程 结束线程 线程的结束
互斥量Mutex ReleaseMutex函数调用之后 互斥量只能有一个线程使用,当一个线程释放成功互斥量的时候,就表示该线程使用完了,其他线程可以用了
信号量 ReleaseSemaphore调用之后 创建好10个厕所,只要有空厕所,事件就触发
事件 SetEvent PulseEvent 这里的事件表示为我们日常生活中的事件

只列出常用,不包含所有对象

core--线程同步(内核模式)的更多相关文章

  1. 线程同步——用户模式下线程同步——Interlocked实现线程同步

    线程同步分为用户模式下的线程同步和内核对象的线程同步. 当然用户模式下的线程同步实现速度比内核模式下快,但是功能也有局 //1.利用原子访问: Interlocked系列函数,关于Interlocke ...

  2. 线程同步——用户模式下线程同步——Slim读写锁实现线程同步

    //Slim读/写锁实现线程同步 SRWlock 的目的和关键段相同:对同一资源进行保护,不让其它线程访问. 但是,与关键段不同的是,SRWlock允许我们区分哪些想要读取资源的线程(读取者线程) 和 ...

  3. 内核模式下的线程同步的分析(Windows核心编程)

    内核模式下的线程同步 内核模式下的线程同步是用户模式下的线程同步的扩展,因为用户模式下的线程同步有一定的局限性.但用户模式下线程同步的好处是速度快,不需要切换到内核模式(需要额外的 CPU 时间).通 ...

  4. C#异步编程(三)内核模式线程同步

    其实,在开发过程中,无论是用户模式的同步构造还是内核模式,都应该尽量避免.因为线程同步都会造成阻塞,这就影响了我们的并发量,也影响整个应用的效率.不过有些情况,我们不得不进行线程同步. 内核模式 wi ...

  5. C#异步编程(二)用户模式线程同步

    基元线程同步构造 多个线程同时访问共享数据时,线程同步能防止数据损坏.不需要线程同步是最理想的情况,因为线程同步存在许多问题. 第一个问题就是它比较繁琐,而且很容易写错. 第二个问题是,他们会损害性能 ...

  6. Windows系统的四个重要概念——进程、线程、虚拟内存、内核模式和用户模式

    引言 本来在写一篇Windows内存管理的文章,写着写着就发现好多基础的概念都要先讲.更可怕的是,这些基础的概念我却不能完全讲清楚.只好再把这本<深入解析Windows操作系统>翻到第一章 ...

  7. 【C#进阶系列】28 基元线程同步构造

    多个线程同时访问共享数据时,线程同步能防止数据损坏.之所以要强调同时,是因为线程同步问题实际上就是计时问题. 不需要线程同步是最理想的情况,因为线程同步一般很繁琐,涉及到线程同步锁的获取和释放,容易遗 ...

  8. C#并行编程(6):线程同步面面观

    理解线程同步 线程的数据访问 在并行(多线程)环境中,不可避免地会存在多个线程同时访问某个数据的情况.多个线程对共享数据的访问有下面3种情形: 多个线程同时读取数据: 单个线程更新数据,此时其他线程读 ...

  9. C#异步编程(四)混合模式线程同步

    之前讨论了基元用户模式和内核模式线程同步构造.其他所有线程同步构造都基于它们,而且一般都合并了用户模式和内核模式构造,我们称为混合线程同步构造.没有线程竞争时,混合构造提供了基元用户模式构造所具有的性 ...

  10. C#线程学习笔记五:线程同步--事件构造

    本笔记摘抄自:https://www.cnblogs.com/zhili/archive/2012/07/23/Event_Constructor.html,记录一下学习过程以备后续查用. 前面讲的线 ...

随机推荐

  1. 【Asp.Net WebFrom】分页

    Asp.Net WebForm 分页 一. 前言 Asp.Net WebForm 内置的DataPager让人十分蛋疼 本文使用的分页控件是第三方分页控件 AspNetPager,下载地址: 链接: ...

  2. ASP.NET 大文件上传的简单处理

    在 ASP.NET 开发的过程中,文件上传往往使用自带的 FileUpload 控件,可是用过的人都知道,这个控件的局限性十分大,最大的问题就在于上传大文件时让开发者尤为的头疼,而且,上传时无法方便的 ...

  3. ASP.NET页面刷新的实现方法总结

    先看看ASP.NET页面刷新的实现方法: 第一: private void Button1_Click( object sender, System.EventArgs e ) { Response. ...

  4. Asp.net与Flex交互测试记录

    一.利用asp.net为Flex提供数据服务,flex为前端表现. 二.flex通过三种方式四种代码实现来取数据.分别为     HttpService. WebService. RemoteObje ...

  5. Sqli-labs less 21

    Less-21 本关对cookie进行了base64的处理,其他的处理流程和less20是一样的. 我们这里可以利用less20同样的方法,但是需要将payload进行base64编码处理(注意这里对 ...

  6. *args和**kw魔法参数

    学Python挺久了,现在才搞懂这个还是有点惭愧 *args:传入元组,无关键字 **kw:传入字典,有关键字 示例: *args **kw 一起使用时args的参数需在前:

  7. C#&java重学笔记(泛型)

    C#部分: 1.泛型的出现主要用于解决类.接口.委托.方法的通用性,通过定义泛型类.接口.委托.方法,可以让不同类型的数据使用相同运算规则处理数据,方便了开发. 2.利用System.Nullable ...

  8. 《Thinking in C++》学习笔记(一)【第二章】

    第二章 对象的创建与使用 2.1语言的翻译过程 翻译器分为两类:解释器(interpreter)和编译器(compiler). 2.1.1解释器 解释器将源代码转化成一些动作(它可由许多机器指令组成) ...

  9. 数据库链接 mysql,sqlserver

    1.生成对象工厂 /// <summary> /// 生成对象工厂 /// </summary> public class DBFactory { /// <summar ...

  10. Hadoop完全分布式集群配置

    1.前话 寒假实在太闲了,所以闲着无聊地去了解"大数据"这个新概念,这几年到处都在说什么大数据时代的,不能不让我感到好奇啊. 大数据有啥用?随便谷歌百度一大堆我也不多说了. 我自己 ...