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. VMware Workstation 15 pro keys

    永久激活密钥UG5J2-0ME12-M89WY-NPWXX-WQH88 GA590-86Y05-4806Y-X4PEE-ZV8E0 YA18K-0WY8P-H85DY-L4NZG-X7RAD UA5D ...

  2. word2vec_文本相似度

    #提取关键词#关键词向量化#相似度计算 from jieba import analyseimport numpyimport gensim # 实现给出任意字符串,获取字符串中某字符的位置以及出现的 ...

  3. spring.boot mybaits集成

    https://www.cnblogs.com/pejsidney/p/9272562.html (insertBatch批量插入) 第一篇博客循环部分有错误,参照下面的例子去更改 List<S ...

  4. rapidjson 的封装学习

    #pragma once #include "Util.h" #include "rapidjson/writer.h" #include "rapi ...

  5. windows 与 Linux SOCKET通讯

    windows client 端口 // Def_win_client_socket_test.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" ...

  6. SpringBoot的读取properties文件的方式

    转载:https://www.imooc.com/article/18252一.@ConfigurationProperties方式 自定义配置类:PropertiesConfig.java pack ...

  7. kbmmw 中XML 操作入门

    delphi 很早以前就自带了xml 的操作,最新版里面有三种XML 解释器,一种是MSXML,看名字就知道 这个是微软自带的,这个据delphi 官方称是速度是最快的,但是只能在windows 上使 ...

  8. Python-IDLE实现清屏

    1.将下面文件复制到命名为ClearWindow.py的文件下,移动到 …Python\Python36-32\Lib\idlelib下. ############################## ...

  9. 先加载js 后载控件

    可以使用如下 $(document).on('click','.classname',function(){});

  10. 第11章:MongoDB-CRUD操作--文档--查询

    ①语法 db.collection.find(query, projection) ②参数 query :可选,使用查询操作符指定查询条件 projection :可选,使用投影操作符指定返回的键.查 ...