等待定时器内核事件
CreateWaitableTimer(
PSECURITY_ATTRIBUTES psa,
BOOL fManualReset,
PCTSTR pszName);
进程可以获得它自己的与进程相关的现有等待定时器的句柄。
HANDLE OpenWaitableTimer(
DWORD dwDesiredAccess,
BOOL bInheritHandle,
PCTSTR pszName);

等待定时器对象总是在未通知状态中创建,必须调用SetWaitableTimer函数来告诉定时器你想在何时让
它成为已通知态。
BOOL SetWaitableTimer(
HANDLE hTimer, //定时器
const LARGE_INTEGER *pDueTime, //pDueTime和lPeriod 一道使用,用于指明定时器何时应该第一次报时
LONG lPeriod,//指明定时器应该多长时间报时一次
PTIMERAPCROUTINE pfnCompletionRoutine,
PVOID pvArgToCompletionRoutine,
BOOL fResume);

FILETIME和LARGE_INTEGER
FILETIME 从32位的边界开始。
LARGE_INTEGER从64位边界开始。
系统移值要考虑对齐的问题。

让等待定时器给APC排队。

信标内核对象
如果当前资源数量大于0,则发出信标信号。
如果当前资源数量是0,则不发出信标信号。
系统绝不允许当前资源的数量为负值。
当前资源的数量决不能大于最大资源数量。
不要把信标的使用数量与它的当前资源数量混为一谈。
HANDLE CreateSemphore(
PSECURITY_ATTRIBUTE psa,
LONG lInitialCount,
LONG lMaximumCount,
PCTSTR pszName);

HANDLE OpenSemaphore(
DWORD fdwAccess,
BOOL bInHeritHandle,
PCTSTR pszName);

ReleaseSemaphore(
HANDLE hsem,
LONG lReleaseCount,
PLONG plPreviousCount)

信标能够以原子操作方式来执行测试和设置操作。 相当于relase 使数量+1,而成功地等待信标的副作用是它的数量递减 1

互斥对象内核对象
互斥对象包含一个使用数量,线程ID和一个递归计数器。
互斥对象比关键代码要慢(前者是内核对象)但可以跨进程

规则:
如果线程ID是0,互斥对象不被任何线程拥有,并发出该互斥对象的通知信号。
如果ID是一个非0数字,那么一个线程就拥有互斥对象,并且不发出该互斥对象的通知信号。
与所有其他内核对象不同,互斥对象在操作系统中拥有特殊的代码,允许它们违反正常规则。
HANDLE CreateMutex(
PSECURITY_ATTRIBUTES psa,
BOOL fInitialOwner,
PCTSTR pszName);
通过OpenMutex,另一个进程可以获得它自己进程与现有互斥对象相关的句柄
HANDLE OpenMutex(
DWORD fdwAccess,
BOOL bInheritHandle,
PCTSTR pszName);

fInitialOwner 控制互斥对象的初始状态,如果设为true,那么线程ID被设为调用线程ID,递归计数器被设1.
如果是false,线程ID和递归计数器都设置为0,这意味着互斥对象没有被任何线程所拥有,因此发出它的通知信号。

通过调用一个等待函数,并传递一个负责保护资源的互斥对象句柄,线程就能够获得对共享资源的访问权。
在内部,等待函数要检查线程的ID,以了解它是否是0,如果线程ID是0,那么该线程ID被设置为调用线程ID,
递归计数设置为1,同时,调用线程保持可调度状态。
如果等待函数发现ID不是0,那么调用线程进入等待状态,系统将记住这个情况,并且在互斥对象的ID重
置为0时,将线程ID设置为等待线程ID,将递归计数器设置为1,并且允许等待线程再次成为可调度线程。
检查和修改都是原子方式进行的。
特殊情况,一个线程试图等待一个未通知的互斥对象,系统查看申请线程ID和互斥对象中记录的线程ID
相同,即使互斥对象处于未通知态,系统也允许线程保持可调度状态。递归计数器加1.

BOOL RelaseMutex(HANDLE hUmtex);
递归计数器减一,当递归计数器为0,线程ID重置0,同时对象变为已通知状态。

释放的时候也要查看线程ID是否相同。
当释放对象之前,拥有互斥对象的线程被终止了,那么系统把该互斥对象视为已经被放弃,
重新初始化。
不同的是等待函数得到的返回值不是WAIT_OBJECT_0 而是,WAIT_ABANDONED.

本文转自莫水千流博客园博客,原文链接:http://www.cnblogs.com/zhoug2020/p/4263760.html,如需转载请自行联系原作者

线程与内核对象的同步-2相关推荐

  1. Windows核心编程 第九章 线程与内核对象的同步(上)

    第9章 线程与内核对象的同步 上一章介绍了如何使用允许线程保留在用户方式中的机制来实现线程同步的方法.用户方式同步的优点是它的同步速度非常快.如果强调线程的运行速度,那么首先应该确定用户方式的线程同步 ...

  2. 线程与内核对象的同步——Windows核心编程学习手札之九

    线程与内核对象的同步 --Windows核心编程学习手札之九 用户方式下的线程同步机制具有速度快的特点,但有其局限性,对于许多应用程序来说,并不合适.例如,互锁函数家族只能在单值上运行,根本无法使线程 ...

  3. Windows核心编程 第九章 线程与内核对象的同步(下)

    9.4 等待定时器内核对象 等待定时器是在某个时间或按规定的间隔时间发出自己的信号通知的内核对象.它们通常用来在某个时间执行某个操作. 若要创建等待定时器,只需要调用C r e a t e Wa i ...

  4. 第九章 线程与内核对象的同步(6)

    六.其他的线程同步函数 1.异步设备I/O 异步设备I/O使得线程能够启动一个读操作或写操作,但是不必等待读操作或写操作完成.设备对象是可以同步的内核对象,可以调用WaitForSingleObjec ...

  5. 第九章 线程与内核对象的同步(4)

    四.信标内核对象 信标内核对象用于资源进行计数.包含:引用计数.最大资源数量(用于标识信标能够控制的资源的最大数量).当期资源数量(用于标识当前可以使用的资源的数量). 信标的使用规则:当前资源数量大 ...

  6. 线程同步--事件内核对象

    现实程序中有时候我们需要对线程执行顺序更加严格的要求. 前面讲到的关键代码段就不适用了. 关键代码段最大的有点就是用户在用户态执行就可以了,不需要进入内核状态.从而减少了进入内核所用的时间. 所以如果 ...

  7. win32 c语言创建线程,【原创】win32线程及线程内核对象

    内核对象与GDI对象 GDI对象: 1. DC 2. 画笔 3. 画刷 内核对象 1. 进程 process 2. 线程 thread 3. 文件 file 4. 事件 envent 5. 信号量 s ...

  8. 线程同步——内核对象实现线程同步——等待函数

    1 对于内核对象实现线程同步,不得不提三点: 2 1)大多数内核对象既有触发也有未触发两个状态 3 比如:进程.线程.作业.文件流.事件.可等待的计时器.信号量.互斥量 4 2)等待函数:等待函数使线 ...

  9. 用内核对象进行线程同步

    本章讨论的是如何使用内核对象来对线程进行同步,与用户模式下的同步机制相比,内核对象的用途要广泛的多.实际上,内核对象唯一的缺点就是他们的性能.当我们调用本章任何一个新函数时,调用线程必须从用户模式切换 ...

最新文章

  1. 这个「化学家」登上Nature封面:工作007,8天完成近700次实验,还设计出新催化剂...
  2. ZABBIX 企业级分布式监控系统 1 监控系统简介
  3. php函数可变参数列表,PHP函数可变参数列表的具体实现方法介绍
  4. [转载] Java | Java 面向对象知识小抄
  5. 字节跳动AI Lab 算法岗专属内推码!
  6. php 控制 打印机 打印尺寸_打破常规尺寸,得实推出宽幅条码标签单据打印机新品...
  7. 【SQL 社区】一些有用的SQL社区!(持续更新~~)
  8. VB2010(24)窗体用户控件
  9. MDK5如何生成bin文件
  10. ZC公司员工评分系统——前台排版算法
  11. 【PHP】最详细PHP从入门到精通(一)
  12. 《2019-2020中国开发者调查报告》发布了!
  13. python写android抢票软件,如何用python写一个简单的12306抢票软件
  14. python书籍推荐django_关于Django,我想推荐这样一本书给你
  15. Recent concerns
  16. 什么是点对点?什么去中心化?
  17. 利用LabVIEW开发应变量测试
  18. mysql占用cpu特别高的解决_mysql占用CPU过高的解决办法
  19. IDEA中Maven项目莫名其妙出现很多飘红
  20. iOS传感器:利用磁力计完成一个AR场景应用

热门文章

  1. oracle轮询方式循环输出,LGWR的两种模式(POST/WAIT和POLLING)
  2. 使用Puppeteer进行数据抓取(一)——安装和使用
  3. spring+mybatis实现读写分离
  4. 避免将项目名称用作映射类型名称
  5. phpweb2.0 开发实战 ----- 配置虚拟主机
  6. ArcGIS.Server.9.2.DotNet自带例子分析(三、一)
  7. PHP-面向对象编程教程
  8. bootstrap按钮的边框问题 去除
  9. .Net Core 商城微服务项目系列(十二):使用k8s部署商城服务
  10. 个人作业——福大微信公众号使用评测