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 SE EE ME用处

    Java SE: 又称J2SE,开发部署桌面应用程序: Java EE:又称J2EE,开发网站 Java ME:是做手机APP开发 EE在SE基础上构建,提供web服务.组件模型.管理和通信API

  2. jquery查找frameset框架内iframe的元素

    老系统还幸存有过时的frameset框架,维护升级工作需要对其内部的iframe中的元素进行相关操作.使用jquery查找子iframe页面内的元素时,总找不到目标元素.后来发现少了contents ...

  3. JDK8集合类源码解析 - ArrayList

    ArrayList主要要注意以下几点: 1构造方法 2添加add(E e) 3 获取 get(int index) 4 删除 remove(int index)    ,   remove(Objec ...

  4. 学习第一天-JAVA

    第一题打印1到1000的奇数 public class OneToThousandOdd{ public static void main(String[] args) { short num = 1 ...

  5. 【转】四、可空类型Nullable<T>到底是什么鬼

    [转]四.可空类型Nullable<T>到底是什么鬼 值类型为什么不可以为空 首先我们都知道引用类型默认值都是null,而值类型的默认值都有非null. 为什么引用类型可以为空?因为引用类 ...

  6. bundler简介(ruby gem)

    簡介 Bundler   RubyGem 是包裝.散佈Ruby程式庫的標準方式,相關文件可以參考 RubyGems Guides 的說明,或是 簡介 plugins 中的第二個例子.在使用rails ...

  7. window.frames

    // 点击事件 function zTreeOnClick(event, treeId, treeNode) { id = treeNode.id; window.frames["treeF ...

  8. mongodb知识积累

    1: 安装mongodb https://www.cnblogs.com/zhangdaicong/p/7492494.html 2:配置文件 vi /etc/mongodb.conf https:/ ...

  9. PHP-CGI、FASTCGI和php-fpm的关系

    首先,CGI是干嘛的?CGI是为了保证web server传递过来的数据是标准格式的,方便CGI程序的编写者. web server(比如说nginx)只是内容的分发者.比如,如果请求/index.h ...

  10. pageshow和pagehide事件

    Firefox和opera有一个特性,往返缓存:可以在用户使用浏览器的后退和前进按钮时加快页面的转换速度,这个缓存不仅保存了页面的数据,还有DOM和JavaScript的状态. 为了更形象的说明bfc ...