什么是内核?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. 《JavaScript高级程序设计》

    第二章在html中使用Javascript2.1<script>在使用<script>嵌入JS代码时,不要再代码中的任何地方出现"</script>&qu ...

  2. 1024: [SCOI2009]生日快乐

    暴力题,N<=10,没注意到平均分,读题真是.. 我们对于一个矩形分成两块进行搜.然后求较大值. ans=min(ans,max(dfs(x,y/n*i,i),dfs(x,y/n*(n-i),n ...

  3. HDOJ 2181 哈密顿绕行世界问题

    哈密顿绕行世界问题 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  4. C#正则表达式大全{转}

    只能输入数字:"^[0-9]*$". 只能输入n位的数字:"^\d{n}$". 只能输入至少n位的数字:"^\d{n,}$". 只能输入m~ ...

  5. 13test02:信用卡校验

    /*#include<iostream> using namespace std; void input(); int counter=0,jishu_sum=0,oushu_sum=0, ...

  6. pyhton Chapter3 读文件

    使用内置函数open()打开文件,data=open("1.txt").利用data.close()关闭文件.利用data.readline()读取文件中的一行数据,然后指示读取文 ...

  7. JQuery拾遗

    1.关于JQuery的animate,可以操作background么? 答:如果是单纯的JQuery不可以,需要引入JQuery的ui核心库.否则只支持宽高.透明度.上下左右位置的变化. 2.能否说一 ...

  8. 【面试题041】和为s的两个数字VS和为s的连续正数序列

    [面试题041]和为s的两个数字VS和为s的连续正数序列 题目一:     输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s.如果有多对数字的和等于s,输出任意一对即可. ...

  9. 控制台应用程序的Main方法

    总结一下Main方法规则: 1.Main 方法名大小写有规范. 2.Main 方法返回类型只有 void.int两种返回类型. 3.Main 方法的参数可以是string[] args,也可以为空,只 ...

  10. cellspacing与cellpadding

    此文引用自cellpadding和cellspacing属性来控制表格边框的间距. 作者:nestea 巢(cell) -- 表格的内容 巢补白(表格填充)(cellpadding) -- 代表巢外面 ...