《Windows核心编程》之“内核对象同步”
来源:互联网 发布:怎么用淘宝买东西支付 编辑:程序博客网 时间:2024/05/16 17:25
本文主要总结如何使用“kernel object”来实现线程间的同步。与用户模式下的同步方法相比,内核对象同步的效率会相对要低一些(需要切换到内核模式下),但是,它可以跨进程使用,而且在编程上也更简单。
除了总结知识点,我还分析了内核对象同步实现的Queue.exe的示例代码,并与上一篇的Queue.exe进行了简单对比。最后,我将介绍微软提供的一种诊断死锁问题的手段:Wait Chain Tranversal。
一、Thread Synchronization with Kernel Object
二、Queue
本例应用内核对象同步,实现了一个(自身)线程安全的CQueue类。(为方便描述,我将上一篇的Queue称为Old Queue,这一章的Queue称为New Queue)。从功能上来看,它与Old Queue差不多,唯一不同的是:New Queue的Server端不再区分请求号的奇偶性。
从实现上来看New Queue:
1)它的底层也是通过预分配数组来实现。
2)它的成员函数比较简单,是标准的queue操作——入队和出队。
3)它的成员变量包含kernel object:一个mutex和一个semaphore。其中,mutex保护队列,包括入队和出队函数;而semaphore保护队列中的元素,修改队列中的元素时,需要先访问它。
4)需要注意的是,在出队函数中,该示例使用的是内存移动的方式,而不是元素拷贝。这样做可以提供效率。
// Shift the remaining elements down MoveMemory(&m_pElements[0], &m_pElements[1], sizeof(ELEMENT) * (m_nMaxElements - 1));
三、WCT -- Wait Chain Tranversal
多线程程序开发过程中,最难的是对多线程的调试和逻辑分析,特别是与锁相关的缺陷分析,比如:死锁和无限等待。为此,微乳提供了一套API,从系统层面来辅助开发者分析各个线程的运行状态(running or blocking)和线程与锁的等待关系,这就是:Wait Chain Tranversal。
关于WCT,我们可以搜索MSDN上的资料:
1) https://msdn.microsoft.com/en-us/library/windows/desktop/ms681622(v=vs.85).aspx
2) https://msdn.microsoft.com/en-us/library/cc308564.aspx
这两个系列的文章对WCT的原理和使用方法进行了相关介绍,并用示例进行了简单 演示。
此外,《Windows核心编程》也提供了Lockcop.exe和badlock.exe这一对示例来演示WCT。
- 《Windows核心编程》之“内核对象同步”
- Windows 核心编程内核对象同步之-Waitable timer
- windows 核心编程之9 内核对象用于线程同步
- windows核心编程之线程内核对象同步(1)
- windows核心编程之线程内核对象同步(2)
- Windows核心编程之3 内核对象
- 《Windows核心编程》之“内核对象”
- Windows核心编程:用内核对象进行线程同步
- Windows核心编程 用内核对象进行线程同步
- windows核心编程-9.用内核对象进行线程同步
- windows核心编程-用内核对象进行线程同步
- windows核心编程---用内核对象进行线程同步
- 线程与内核对象的同步——Windows核心编程学习手札之九
- 摘自windows核心编程之用内核对象进行线程同步
- (摘自windows核心编程之用内核对象进行线程同步)
- (摘自windows核心编程之用内核对象进行线程同步)
- windows核心编程--内核对象
- windows核心编程--内核对象
- poj 3104 Drying 二分答案
- Convolutional neural networks(CNN) (十一) Convolution and Pooling Exercise
- Vector小记
- MYSQL下载安装配置卸载图文教程
- Windows下用脚本批量重命名文件
- 《Windows核心编程》之“内核对象同步”
- Java四种内部类
- unity 相机平滑跟随游戏角色
- 替换默认mac ctags
- 架构设计:负载均衡层设计方案(2)——Nginx安装
- C++函数参数传递--值传递和地址传递
- IOS-自动打包Shell脚本(支持目录带空格)
- 动态链接库的显示加载和隐式加载的区别
- centos命令行安装MySQL