Windows核心编程:第9章 用内核对象进行线程同步
Github
https://github.com/gongluck/Windows-Core-Program.git
//第9章 用内核对象进行线程同步.cpp: 定义应用程序的入口点。
//
#include "stdafx.h"
#include "第9章 用内核对象进行线程同步.h"
#include <Wct.h>
DWORD WINAPI Thread(PVOID param)
{
Sleep(2000);
return 0;
}
HANDLE g_event = nullptr;
DWORD WINAPI Thread2(PVOID param)
{
WaitForSingleObject(g_event, INFINITE);
//使事件未触发
BOOL bres = ResetEvent(g_event);
//处理事件
//...
//触发事件
bres = SetEvent(g_event);
return 0;
}
HANDLE g_timer = nullptr;
DWORD WINAPI Thread3(PVOID param)
{
WaitForSingleObject(g_timer, INFINITE);
return 0;
}
int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
_In_opt_ HINSTANCE hPrevInstance,
_In_ LPWSTR lpCmdLine,
_In_ int nCmdShow)
{
HANDLE hthread = CreateThread(nullptr, 0, Thread, nullptr, 0, nullptr);
//等待线程被触发
DWORD dres = WaitForSingleObject(hthread, INFINITE);//INFINITE等待无限长的时间
switch (dres)
{
case WAIT_OBJECT_0:
//线程被触发(终止)
CloseHandle(hthread);
hthread = nullptr;
break;
case WAIT_TIMEOUT:
//超时
break;
case WAIT_FAILED:
//FAILED
break;
}
HANDLE hthreads[3];
for (int i = 0; i < 3; ++i)
hthreads[i] = CreateThread(nullptr, 0, Thread, nullptr, 0, nullptr);
//等待多个线程被触发
dres = WaitForMultipleObjects(3, hthreads, FALSE, INFINITE);
switch (dres)
{
case WAIT_OBJECT_0+0:
//线程被触发(终止)
CloseHandle(hthreads[0]);
hthreads[0] = nullptr;
break;
case WAIT_OBJECT_0+1:
//线程被触发(终止)
CloseHandle(hthreads[1]);
hthreads[1] = nullptr;
break;
case WAIT_OBJECT_0+2:
//线程被触发(终止)
CloseHandle(hthreads[2]);
hthreads[2] = nullptr;
break;
case WAIT_TIMEOUT:
//超时
break;
case WAIT_FAILED:
//FAILED
break;
}
dres = WaitForMultipleObjects(3, hthreads, TRUE, INFINITE);
for (int i = 0; i < 3; ++i)
{
if (hthreads[i] == nullptr)
continue;
CloseHandle(hthreads[i]);
hthreads[i] = nullptr;
}
//事件
//OpenEvent打开已创建的事件
g_event = CreateEvent(nullptr, TRUE, FALSE, nullptr);//如果是自动重置事件,能让等待线程得到事件后马上把事件置为未触发,造成同时只有一个线程得到事件!
HANDLE hthreads2[2];
for (int i = 0; i < 2; ++i)
hthreads2[i] = CreateThread(nullptr, 0, Thread2, nullptr, 0, nullptr);
SetEvent(g_event);//触发事件
dres = WaitForMultipleObjects(2, hthreads2, TRUE, INFINITE);
for (int i = 0; i < 2; ++i)
{
if (hthreads2[i] == nullptr)
continue;
CloseHandle(hthreads2[i]);
hthreads2[i] = nullptr;
}
CloseHandle(g_event);
g_event = nullptr;
//可等待的计时器内核对象
//OpenWaitableTimer打开已创建的定时器
g_timer = CreateWaitableTimer(nullptr, TRUE, nullptr);
LARGE_INTEGER li;
li.QuadPart = -(2 * 10000000);
SetWaitableTimer(g_timer, &li, 0, nullptr, nullptr, FALSE);
HANDLE hthread3 = CreateThread(nullptr, 0, Thread3, nullptr, 0, nullptr);
WaitForSingleObject(hthread3, INFINITE);
CloseHandle(hthread3);
hthread3 = nullptr;
CancelWaitableTimer(g_timer);
CloseHandle(g_timer);
g_timer = nullptr;
//信号量
//CreateSemaphore
//OpenSemaphore
//WaitForSingleObject
//ReleaseSemaphore
//互斥量
//CreateMutex
//OpenMutex
//WaitForSingleObject
//ReleaseMutex
//WaitForInputIdle
//这对于父进程和子进程之间的同步是极其有用的,因为CreateProcess函数不会等待新进程完成它的初始化工作。
//在试图与子线程通讯前,父线程可以使用WaitForInputIdle来判断子线程是否已经初始化完成。
//MsgWaitForMultipleObjects
//等候单个对象或一系列对象发出信号---标志着规定的超时已经过去,或特定类型的消息已抵达线程的输入队列。如返回条件已经满足,则立即返回
//WaitForDebugEvent
//获取调试事件
//SignalObjectAndWait
//触发一个对象并等待另一个对象
//等待链遍历(WCT)
//OpenThreadWaitChainSession
//GetThreadWaitChain
system("pause");
return 0;
}
Windows核心编程:第9章 用内核对象进行线程同步的更多相关文章
- 《Windows核心编程》第九章——用内核对象进行线程同步
先举一个有bug的例子: #include <iostream> #include <windows.h> #include <process.h> using n ...
- Windows核心编程学习九:利用内核对象进行线程同步
注:源码为学习<Windows核心编程>的一些尝试,非原创.若能有助于一二访客,幸甚. 1.程序框架 #include "Queue.h" #include <t ...
- windows核心编程---第七章 用户模式下的线程同步
用户模式下的线程同步 系统中的线程必须访问系统资源,如堆.串口.文件.窗口以及其他资源.如果一个线程独占了对某个资源的访问,其他线程就无法完成工作.我们也必须限制线程在任何时刻都能访问任何资源.比如在 ...
- 【windows核心编程】 第八章 用户模式下的线程同步
Windows核心编程 第八章 用户模式下的线程同步 1. 线程之间通信发生在以下两种情况: ① 需要让多个线程同时访问一个共享资源,同时不能破坏资源的完整性 ② 一个线程需要通知其他线程 ...
- 《windows核心编程系列》三谈谈内核对象及句柄的本质
内核对象 本章讨论的是相对抽象的概念,不涉及任何具体的内核对象的细节而是讨论所有内核对象的共有特性. 首先让我们来了解一下什么是内核对象.内核对象通过API来创建,每个内核对象是一个数据结构,它对应一 ...
- Windows核心编程(第5版)----关闭内核对象
无论怎样创建内核对象,都要向系统指明将通过调用 CloseHandle 来结束对该对象的操作: BOOL CloseHandle(HANDLE hobj); 该函数首先检查调用进程的句柄表,以确保传递 ...
- 第9章 用内核对象进行线程同步(4)_死锁(DeadLock)及其他
9.7 线程同步对象速查表 对象 何时处于未触发状态 何时处于触发状态 成功等待的副作用 进程 进程仍在运行的时候 进程终止的时(ExitProcess.TerminateProcess) 没有 线程 ...
- 第9章 用内核对象进行线程同步(3)_信号量(semaphore)、互斥对象(mutex)
9.5 信号量内核对象(Semaphore) (1)信号量的组成 ①计数器:该内核对象被使用的次数 ②最大资源数量:标识信号量可以控制的最大资源数量(带符号的32位) ③当前资源数量:标识当前可用资源 ...
- 第9章 用内核对象进行线程同步(2)_可等待计时器(WaitableTimer)
9.4 可等待的计时器内核对象——某个指定的时间或每隔一段时间触发一次 (1)创建可等待计时器:CreateWaitableTimer(使用时应把常量_WIN32_WINNT定义为0x0400) 参数 ...
随机推荐
- jsp页面错误的全局处理
网上搜索spring mvc项目全局异常处理: 大致可以找到两种方案 : 方案1: ExceptionHandlerResolver . spring 提供了两种默认实现,当然你也可以自己实现.. 方 ...
- DataTable xml 互相转换
//测试方法 public static DataTable Test() { string savePath = System.AppDomain.CurrentDomain.BaseDirecto ...
- SQL判断如果一列值为null则取另一列值代替 isnull()
[chClientCode] ,[nvcClientName] ,[chRegionCode] ,isnull(chUltimateHeadClientCode,[chClientCode]) as ...
- linux_关闭防火墙
centos6版本 永久关闭 chkconfig iptables off 查看状态 chkconfig iptables --list 此时关闭开机重新启动 service iptables sto ...
- 简单实现java线程池
使用多线程以及线程池的意义无需多说,要想掌握线程池,最好的方法还是自己手动去实现. 一.实现思路 (网络盗图) 二.实现代码 1.线程池类 package com.ty.thread; im ...
- mysql学习之路_事物_存储过程_备份
数据备份与还原 备份:将当前已有的数据保留. 还原:将已经保留的数据恢复到对应表中 为什么要做数据备份 1,防止数据丢失,被盗,误操作 2,保护数据记录 数据备份还原方式有多种:数据表备份 单表数据备 ...
- HDU 5321 Beautiful Set (莫比乌斯反演 + 逆元 + 组合数学)
题意:给定一个 n 个数的集合,然后让你求两个值, 1.是将这个集合的数进行全排列后的每个区间的gcd之和. 2.是求这个集合的所有的子集的gcd乘以子集大小的和. 析:对于先求出len,len[i] ...
- php,合并数组,合并一维数组,合并二维数组,合并多维数组
合并数组 例子1: <?php $msg = [ "code" => "0", "msg" => "" ...
- ajax 简单实例
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <script> ...
- PHP continue break 区别 用法
<?php //continue 跳过当前循环,进行下一个 //break 终止当前循环 $db=new PDO("mysql:host=localhost;dbname=root&q ...