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章 用内核对象进行线程同步的更多相关文章

  1. 《Windows核心编程》第九章——用内核对象进行线程同步

    先举一个有bug的例子: #include <iostream> #include <windows.h> #include <process.h> using n ...

  2. Windows核心编程学习九:利用内核对象进行线程同步

    注:源码为学习<Windows核心编程>的一些尝试,非原创.若能有助于一二访客,幸甚. 1.程序框架 #include "Queue.h" #include <t ...

  3. windows核心编程---第七章 用户模式下的线程同步

    用户模式下的线程同步 系统中的线程必须访问系统资源,如堆.串口.文件.窗口以及其他资源.如果一个线程独占了对某个资源的访问,其他线程就无法完成工作.我们也必须限制线程在任何时刻都能访问任何资源.比如在 ...

  4. 【windows核心编程】 第八章 用户模式下的线程同步

    Windows核心编程 第八章 用户模式下的线程同步 1. 线程之间通信发生在以下两种情况: ①    需要让多个线程同时访问一个共享资源,同时不能破坏资源的完整性 ②    一个线程需要通知其他线程 ...

  5. 《windows核心编程系列》三谈谈内核对象及句柄的本质

    内核对象 本章讨论的是相对抽象的概念,不涉及任何具体的内核对象的细节而是讨论所有内核对象的共有特性. 首先让我们来了解一下什么是内核对象.内核对象通过API来创建,每个内核对象是一个数据结构,它对应一 ...

  6. Windows核心编程(第5版)----关闭内核对象

    无论怎样创建内核对象,都要向系统指明将通过调用 CloseHandle 来结束对该对象的操作: BOOL CloseHandle(HANDLE hobj); 该函数首先检查调用进程的句柄表,以确保传递 ...

  7. 第9章 用内核对象进行线程同步(4)_死锁(DeadLock)及其他

    9.7 线程同步对象速查表 对象 何时处于未触发状态 何时处于触发状态 成功等待的副作用 进程 进程仍在运行的时候 进程终止的时(ExitProcess.TerminateProcess) 没有 线程 ...

  8. 第9章 用内核对象进行线程同步(3)_信号量(semaphore)、互斥对象(mutex)

    9.5 信号量内核对象(Semaphore) (1)信号量的组成 ①计数器:该内核对象被使用的次数 ②最大资源数量:标识信号量可以控制的最大资源数量(带符号的32位) ③当前资源数量:标识当前可用资源 ...

  9. 第9章 用内核对象进行线程同步(2)_可等待计时器(WaitableTimer)

    9.4 可等待的计时器内核对象——某个指定的时间或每隔一段时间触发一次 (1)创建可等待计时器:CreateWaitableTimer(使用时应把常量_WIN32_WINNT定义为0x0400) 参数 ...

随机推荐

  1. java正则表达式(字符串)

    参考:http://blog.csdn.net/kdnuggets/article/details/2526588 补充: ?号的使用: ^/branch/([a-z]+[/]?)$  可以匹配 /b ...

  2. spring security 4.2后出现CouldnotverifytheprovidedCSRFtokenbecauseyoursessionwasnotfound

    升级到spring security 4.2后,登录不了,出现下面的错误 WARN DefaultHandlerExceptionResolver:361 - Failed to bind reque ...

  3. Python内置logging模块

    最近调试Python代码比较多,发现logging模块很好用. 我的用法如下: import logging logging.basicConfig(level=logging.INFO, forma ...

  4. Viewer.js 是一款强大的 jQuery 图像浏览插件。

    https://blog.csdn.net/qq_29132907/article/details/80136023 一.效果图  二.代码<!DOCTYPE html><html ...

  5. 746. Min Cost Climbing Stairs

    两种方法,核心思想都一样,求出走到每一步上的最小开销,直到最后一步和倒数第二步,比较其最小值返回即可. 方法一,用一个辅助的容器 class Solution { public: int minCos ...

  6. 2019.01.14 codeforces685B. Kay and Snowflake(树形dp)

    传送门 题意简述:给出一棵树,求每个子树的重心. 首先通过画图可以观察出一个性质,我们从叶子结点向根节点递推重心的话重心的位置是不会下降的. 然后由于一个点的重心要么是自己,要么在重儿子子树内,因此如 ...

  7. shell知识积累

    Ubuntu下常用的快捷键:https://blog.csdn.net/u010771356/article/details/53543041 变量名和等号之间不能有空格,变量名中间不能有空格,可以使 ...

  8. c# 快速排序法并记录数组索引

    在遗传算法中,只需要对适应性函数评分进行排序,没必要对所有的个体也参与排序,因为在适应性函数评分排序是可以纪律下最初的索引,排序后的索引随着元素排序而变动,这样就知道那个评分对应那个个体了: usin ...

  9. ZOJ 3156 Taxi (二分 + 二分匹配)

    题意:给定 n 个人坐标, m 辆车的坐标,还有人的速度,要求每个人要进一辆不同的车,问你所有都进车的最短时间是多少. 析:首先二分时间 mid,很明显就是最后那个人进车的时间,然后如果把第 i 个人 ...

  10. 很实用的linux 上的svn安装和svnserver 的重启

    虽然在windows上搭建SVN很简单,但是效能却不高,这当然是和linux相比了.然而在linux上搭建SVN却非常繁琐,所以今天这篇文章就来一步一步教您如何在Centos上搭建SVN 安装 #yu ...