线程与内核对象的同步-2

等待定时器内核事件
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,如需转载请自行联系原作者

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/256754.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Win10 应用开发】自定义应用标题栏

Win 10 app对窗口标题栏的自定义包括两个层面:一是只定义标题中各部分的颜色,如标题栏上文本的颜色、三个系统按钮(最大化,最小化,关闭)的背景颜色等;另一层是把窗口的可视区域直接扩展到标题栏…

学习笔记(59):Python实战编程-Graphics

立即学习:https://edu.csdn.net/course/play/19711/343123?utm_sourceblogtoedu 1.graphics:图形界面组件的绘制,利用的是坐标的定位来对各个组件进行相对地位置布局 2.graphics与thinkter的区别 1)窗口的创建上: win graphics…

IIS6配置Asp.net MVC运行环境

Windows server 2003 IIS6 搭建Asp.net MVC运行环境 1、安装.Net Framework4.0。 下载地址: http://www.microsoft.com/zh-cn/download/details.aspx?id17718 2、安装WindowsServer2003-KB968930-x86-CHS.exe,PowerShell 2.0的补丁 下载地址&#xff1…

VIO-slam 系统构建

文章目录 目录 文章目录 前言 一、VIO系统数据的获取:图像传感器选型、IMU传感器选型 二、建立linux系统ROS环境 三、如何读取图像数据 四、如何读取IMU传感器数据 五、标定图像和IMU数据的外参、相机的内参 六、移植VINS-MONO或者VINS-FUSION:主要调试获…

MySQL5.7多源复制的实验

MySQL5.7多源复制的实验 node1: 192.168.2.171 master1 node2: 192.168.2.172 slave node3: 192.168.2.170 master2 node2上执行: change master to master_host192.168.2.171, master_userrpl, master_passwordAbcd1234, master_port3306, master_log…

最优化课堂笔记04:非线性规划(考点4-5例题)

目录 4.1 多元函数的泰勒展开 4.2方向导数与梯度 4.2.1方向导数 n元函数在点沿特定方向的方向导数 4.2.2梯度 4.3二次函数及正定矩阵 4.4凸函数与凸规划 4.4.1凸函数 4.4.2凸规划 4.4无约束优化问题的极值条件 4.5约束优化问题的极值条件(重点考点&#x…

k近邻算法C++二维情况下的实现

k近邻算法C二维实现 这是一个k近邻算法的二维实现&#xff08;即K2的情况&#xff09;。 #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <vector> #include <queue> #include <cmath> u…

java——对象学习笔记

1.面向对象&#xff08;OOP&#xff09;的三大特性 对象的行为&#xff08;behavior&#xff09;&#xff1a;可以对对象施加哪些操作&#xff0c;或者可以对对象施加哪些方法。 对象的状态&#xff08;state&#xff09;&#xff1a;当施加那些方法后&#xff0c;对象如何响应…

C++获取一段算法程序耗时方法

1、添加头文件库#include <chrono> 2、代码编写 std::chrono::steady_clock::time_point t1 std::chrono::steady_clock::now(); std::chrono::steady_clock::time_point t2 std::chrono::steady_clock::now(); std::chrono::duration<double> time_used12 st…

cisco 动态路由协议RIP笔记

动态路由协议RIP router(config)#router rip 启动RIP进程 router(config-router)#network 1.0.0.0 宣告主网络号 router(config-router)#version 2 使用版本v2 router(config-router)#no auto-summary 关闭路由汇总功能 本文转自 meteor_hy 51CTO博客&#xff0c;原文链接&a…

EBS FORM开发问题总结

1&#xff0c;form是基于单表视图建立的&#xff0c;没有写on-insert此类的触发器。在视图上加了个rownum列结果导致form上的列不能更新 据说此种情形下的form会判断视图上的列是否属于基表&#xff0c;不属于的话会导致整个块不能更新。 2&#xff0c;在form界面上显示行号 在…

Django 学习资源

相关的分享&#xff1a; 开发者头条&#xff1a;http://toutiao.io/search?utf8%E2%9C%93&qdjango 极客头条及Django资讯&#xff1a;http://www.csdn.net/tag/django/news 一些优秀的文章&#xff1a; Django 常用测试方法&#xff1a;https://messense.me/django-common…

orb-slam2在PC和ARM上运行

ORBSLAM2的编译与运行 环境&#xff1a;Ubuntu16.04 ORBSLAM2 &#xff08;1&#xff09;安装工具 sudo apt-get install cmake sudo apt-get install git sudo apt-get install gcc g (2) 安装pangolin 安装依赖项&#xff1a; sudo apt-get install libglew-dev sudo ap…

烂泥:智能DNS使用与配置

公司的业务现在已经扩展到海外&#xff0c;对外提供的统一接口都是通过域名来解析的&#xff0c;但是海外用户访问国内接口的话&#xff0c;你懂的&#xff0c;很慢的。为了提高域名解析的速度&#xff0c;打算使用智能DNS功能&#xff0c;来解决海外用户域名解析慢的问题。 PS…

现代制造工程——考试复习01

第一部分 金属切削原理 1.切削过程中工件上的加工表面分类 2.不同工艺的工件和刀具的相对关系 3.不同工艺的主运动和进给运动的方向 4.思考&#xff1a;主运动一般只有一个&#xff0c;但是进给运动一个也可以是多个 5.切削三要素&#xff08;必考&#xff09; 6.思考&#x…

C++,C++编程,Windows编程,MFC

编程  我们日常生活中接触到的电子类产品中的应用都是由编程而来  为什么编程&#xff0c;偷懒  我们通过编程驱使&#xff08;指挥&#xff0c;命令&#xff09;的是电信号  为什么上面说编程是偷懒&#xff0c;电的发现&#xff0c;给人们带来了便利&#xff0c;人们…

orb-slam2 代码逻辑梳理

1、开发大型C系统&#xff0c;可以首先从头文件开始&#xff1b;先把头文件的各种接口定义好&#xff1b;含义定义好&#xff1b;实现的时候只管内部实现就行&#xff0c;不需要管理外部的逻辑交互 2、定义在类中的变量&#xff0c;可以在前面加个小标志&#xff0c;mcamerMati…

eclipse中java项目转换为web项目

123456789101112经常在eclipse中导入web项目时&#xff0c;出现转不了项目类型的问题&#xff0c;导入后就是一个java项目&#xff0c;有过很多次经历&#xff0c;今天也有同事遇到类似问题&#xff0c;就把这个解决方法记下来吧&#xff0c;免得以后再到处去搜索。解决步骤&am…

让执行程序引用特定目录下的Dll

当写一个软件&#xff0c;特别是大型的软件&#xff0c;经常会引用一些第三方的类库&#xff0c;再加上一些自己的项目&#xff0c;如果这些Dll全都放在主目录下的话&#xff0c;会显得比较杂乱。我们希望将项目的类库分类成文件夹存放&#xff0c;这样才显得比较整洁。 解决方…