专栏首页C++Windows核心编程:第9章 用内核对象进行线程同步

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;
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Windows核心编程:第11章 Windows线程池

    https://github.com/gongluck/Windows-Core-Program.git

    gongluck
  • Windows核心编程:第8章 用户模式下的线程同步

    https://github.com/gongluck/Windows-Core-Program.git

    gongluck
  • Windows核心编程:第4章 进程

    gongluck
  • FFmpeg 开发(02):利用 FFmpeg 和 ANativeWindow 实现视频解码播放

    上一篇文章FFmpeg 开发(01):FFmpeg 编译和集成 实现了 FFmpeg 的编译和集成。

    字节流动
  • FFmpeg 开发(02):FFmpeg + ANativeWindow 实现视频解码播放

    本文将利用 FFmpeg 对一个 Mp4 文件的视频流进行解码,然后使用 libswscale 将解码后的 YUV 帧转换为 RGBA 帧,最后使用 ANati...

    字节流动
  • 有意思,使用FtpClient上传文件,上传后的文件总是会莫名奇妙的变大

    代码主要是从手机上选择照片上传到服务端,具体实现逻辑中,服务端会先将上传请求中的文件数据放到服务端机器的缓存目录,然后再从缓存目录挪到另外一台FTP服务其中。

    LeoXu
  • 附002.Nginx代理相关模块解析

    Context: location, if in location, limit_except

    木二
  • 【RL-TCPnet网络教程】第35章 FTP文件传输协议基础知识

    本章节为大家讲解FTP(File Transfer Protocol,文件传输协议)的基础知识,方便后面章节的实战操作。

    armfly
  • 从哪些方面来选择外卖送餐系统

    随着外卖市场的不断发展,越来越多的创业者选择外卖系统。而随之而来的有一个问题就是,外卖送餐系统太多,该如何选择呢?又或者说,从哪些方面来选择外卖送餐系统呢?

    金优外卖
  • 【最佳实践】如何优雅的进行重试

    最近公司在搞活动,需要依赖一个第三方接口,测试阶段并没有什么异常状况,但上线后发现依赖的接口有时候会因为内部错误而返回系统异常,虽然概率不大,但总因为这个而报警...

    猿天地

扫码关注云+社区

领取腾讯云代金券