016 事件内核对象4

示例

#define UNICODE
#include <stdio.h>
#include <tchar.h>
#include <windows.h>
#include <process.h>

#define ___tmainCRTStartup
int *gPNum;
BOOL gUsing = FALSE;

void Entry()
{
    while(InterlockedExchange((long*)&gUsing,TRUE) == TRUE)
    {
        Sleep(0);
    }
}
void Leave()
{
    InterlockedExchange((long*)&gUsing, FALSE);
}

void ThreadPrint(TCHAR* strText)
{
    Entry();
    _tprintf(strText);
    Leave();
}

unsigned __stdcall StartThread(void* lParam)
{
    ThreadPrint("StarThread Beging.......\r\n");
    gPNum = new int(0);
    Sleep(1000);
    ThreadPrint("StarThread End.......\r\n");
    return 0;
}

unsigned __stdcall EndThread(void* lParam)
{
    ThreadPrint("EndThread Beging.......\r\n");
    HANDLE hStart = lParam;
    WaitForSingleObject(hStart, INFINITE);
    delete gPNum;
    ThreadPrint("EndThread End.......\r\n");
    return 0;
}

int main()
{
    HANDLE hStart = (HANDLE)_beginthreadex(nullptr, 0, StartThread, nullptr, 0, nullptr);
    HANDLE hEnd = (HANDLE)_beginthreadex(nullptr, 0, EndThread, hStart, 0 , nullptr);
    WaitForSingleObject(hEnd,INFINITE);
    return 0;
}

无法正常显示

使用事件内核对象

  ● CreateEvent

    ○ CreateEvent是一个Windows API函数。它用来创建或打开一个命名的或无名的事件对象。如果想为对象指定一个访问掩码,应当使用CreateEventEx函数。

  ● 函数原型

1 HANDLE WINAPI CreateEvent(
2   _In_opt_ LPSECURITY_ATTRIBUTES lpEventAttributes,
3   _In_     BOOL                  bManualReset,
4   _In_     BOOL                  bInitialState,
5   _In_opt_ LPCTSTR               lpName
6 );

  ○ 参数1:lpEventAttributes[输入]

    ○ 一个指向SECURITY_ATTRIBUTES结构的指针,确定返回的句柄是否可被子进程继承。如果lpEventAttributes是NULL,此句柄不能被继承。

  ○ 参数2:bManualReset[输入]

    ○ 指定将事件对象创建成手动复原还是自动复原。如果是TRUE,那么必须用ResetEvent函数来手工将事件的状态复原到无信号状态。如果设置为FALSE,当一个等待线程被释放以后,系统将会自动将事件状态复原为无信号状态。

  ○ 参数3:bInitialState[输入]

    ○ 指定事件对象的初始状态。如果为TRUE,初始状态为有信号状态;否则为无信号状态。

  ○ 参数4: lpName[输入]

    ○ 指定事件的对象的名称,是一个以0结束的字符串指针。名称的字符格式限定在MAX_PATH之内。名字是对大小写敏感的。

 1 #define UNICODE
 2 #include <stdio.h>
 3 #include <tchar.h>
 4 #include <windows.h>
 5 #include <process.h>
 6
 7 #define ___tmainCRTStartup
 8 int *gPNum;
 9 BOOL gUsing = FALSE;
10
11 //事件内核对象
12     //自动重置
13     //手动重置
14 void Entry()
15 {
16     while(InterlockedExchange((long*)&gUsing,TRUE) == TRUE)
17     {
18         Sleep(0);
19     }
20 }
21 void Leave()
22 {
23     InterlockedExchange((long*)&gUsing, FALSE);
24 }
25
26 void ThreadPrint(TCHAR* strText)
27 {
28     Entry();
29     _tprintf(strText);
30     Leave();
31 }
32
33 unsigned __stdcall StartThread(void* lParam)
34 {
35     ThreadPrint("StarThread Beging.......\r\n");
36     gPNum = new int(0);
37     Sleep(1000);
38     ThreadPrint("StarThread End.......\r\n");
39     return 0;
40 }
41
42 unsigned __stdcall EndThread(void* lParam)
43 {
44     ThreadPrint("EndThread Beging.......\r\n");
45     HANDLE hStart = lParam;
46     WaitForSingleObject(hStart, INFINITE);
47     delete gPNum;
48     ThreadPrint("EndThread End.......\r\n");
49     return 0;
50 }
51
52 int main()
53 {
54     //事件内核对象
55     HANDLE hEvent = CreateEvent(nullptr, TRUE, TRUE, TEXT("MyEvent"));
56                                          // TRUE 手动
57                                          // FALSE 自动
58     WaitForSingleObject(hEvent,INFINITE);    //等待信号 Single
59     ResetEvent(hEvent);                        //变成NonSingle 变成没有信号的状态
60     HANDLE hStart = (HANDLE)_beginthreadex(nullptr, 0, StartThread, nullptr, 0, nullptr);
61     HANDLE hEnd = (HANDLE)_beginthreadex(nullptr, 0, EndThread, hStart, 0 , nullptr);
62     WaitForSingleObject(hEnd,INFINITE);
63     return 0;
64 }

● CreateEventEx XP 不支持 Windows Vista 支持

● 函数原型

  ○ 权限

    ○ 用户级别权限

    ○ 读权限或者写权限

1 HANDLE WINAPI CreateEventEx(
2 _In_opt_ LPSECURITY_ATTRIBUTES lpEventAttributes,
3 _In_opt_ LPCTSTR lpName,
4 _In_ DWORD dwFlags,
5 _In_ DWORD dwDesiredAccess
6 );

  ● lpEventAttributes[in, optional] :
    ○ 一个指向SECURITY_ATTRIBUTES结构的指针,如果该参数设为NULL,那么事件内核对象的句柄不能被子进程继承.
  ● lpName[in, optional] :
    ○ 指向事件内核对象的名称字符串的指针,如果该参数设为NULL,那么这个对象被创建为一个匿名事件内核对象.
  ● dwFlags[in] :
    ○ 这个参数可被设为以下一个或多个值.
      ○ CREATE_EVENT_INITIAL_SET 0x00000002
        ○ 对象初始状态为已触发,否则为未触发.
      ○ CREATE_EVENT_MANUAL_RESET0x00000001
        ○ 这个事件对象必须用ResetEvents函数手动重置,如果不设置这个标志,系统会在内核对象被释放后自动重置.
  ● dwDesiredAccess[in] :
    ○ 访问权限描述标记,详情见Synchronization Object Security and Access Rights[1]

时间: 2024-08-02 15:14:27

016 事件内核对象4的相关文章

线程同步——内核对象实现线程同步——事件内核对象

1 事件内核对象 2 3 事件类型对象有两种不同类型,手动重置和自动重置 4 手动重置:当一个手动重置对象被触发时候,等待该对象的所有线程变为可调度. 5 自动重置:当一个自动重置对象被触发时,只有一个等待该事件的线程会变为可调度 6 7 下面是一个创建事件内核对象的函数: 8 HANDLE CreateEvent( 9 LPSECURITY_ATTRIBUTES lpEventAttributes, 10 BOOL bManualReset, 11 BOOL bInitialState, 12

线程与内核对象的同步

线程与内核对象的同步内核对象可以处于已通知或未通知状体进程,线程,作业,文件,控制台输入,文件修改,事件,可等待定时器 等待函数DWORD WaitForSingleObject(HANDLE hobject, DWORD dwMilliseconds); 同时查看若干个内核对象已通知状体DWORD WaitForMultipleObjects(DWORD dwCount,CONST HANDLE* phObjects,BOOL fWaitAll,DWORD dwMilliseconds);dw

内核对象进行线程同步

前言: 具体的可等待的内核对象有: 进程,线程,作业,文件以及控制台的标准输入流/输出流/错误流,事件,可等待的计时器,信号量,互斥量. 等待函数: DWORD WaitForSingleObject( HANDLE hObject,//用来标识要等待的内核对象 DWORD dwMilliseconds);//等待的时间 DWORD WaitForMultipleObjects( DWORD dwCount,//函数检查的内核对象的数量(最大为MAXIMUM_WAIT_OBJECTS) CONS

016 内核对象1

内核对象 ● 内核对象 ● 句柄的本质 ● 下载 WinObj ○ https://technet.microsoft.com/en-us/sysinternals/bb896657/ ● WinObj 主要是用来参看我们系统中的内核对象 ○ 必须用管理员权限启动程序 ○ 内核对象是属于我的系统的内核对象 ○ 进程仅仅拥有内核对象的使用权 ○ 并且是受限制的 ● RO 跟 R3的关系 ○ R3下的操作都需要通过R0层进行操作 ○ R3下就好像是 R0的一个虚拟镜像,实际操作还是由R0层操作的 ●

第3章 内核对象(1)

3.1 何为内核对象 3.1.1 Windows平台上的3大对象 (1)分类 对象 描述 备注 GUI对象 也叫用户对象,一般是单线程访问,属于线程级的对象,如 加速键表(HACCEL).插入记号(Caret).光标(HCURSOR).桌面(HDESK). 钩子(HHOOK).图标(HICON).菜单(HMENU).窗口(HWND).窗口栈(HWINSTA) 句柄值是系统唯一的,即一个进程可以通过该句柄值对另一个进程中的对象进行操作,如发送消息. GDI对象 如DC.Pen.Font等,一般是单

Windows内核之内核对象

1内核对象定义: 1.1:每个内 核对象只是内核分配的一个内存块,并且只能由该内核访问. 1.2:该内存块是一种数据结构,它的成员负责维护该对象的各种信息. 有些数据成员(如安全性描述符.使用计数等)在所有对象类型中是相同的,但大多数数据成员属于特定的对象类型.例如,进程对象有一个进程ID .一个基 本优先级和一个退出代码,而文件对象则拥有一个字节位移.一个共享模式和一个打开模式. 2内核对象种类: 比如存取符号对象. 事件对象.文件对象.文件映射对象.I / O 完成端口对象.作业对象.信箱对

windows编程基础之内核对象

      学好windows编程,理解内核对象还是至关重要的(●'?'●).闲话不多说,下面先来了解一下关于内核对象的知识:       内核对象(kernel object):内核对象是用于管理进程.线程和文件等诸多种类的大量资源.       内核对象的分类:进程对象,线程对象,互斥量(mutex)对象,信号量(semaphore)对象,事件对象,作业对象,文件对象,文件映射对象,管道(pipe)对象,邮件槽(mailslot)对象,I/O完成端口对象,线程池工厂(thread pool 

RT-thread内核对象标志flag总结

一.内核标志flag 在内核对象控制块中有一个标志成员flag(rt_uint8_t flag; ),这个标志在不同有内核对象中具有不同的含义.rt-thread的内核对象有定时器.线程.信号量.互斥锁.事件.邮箱.消息队列.内存堆.设备.模块,这些内核对象都继承了内核对象的成员,其中也就包含了内核对象的flag成员,因此,内核对象成员flag在这些不同的场合是具体不同的含义的. 二.flag在定时器中的定义    #define RT_TIMER_FLAG_DEACTIVATED 0x0 /*

线程同步——内核对象实现线程同步——等待函数

1 对于内核对象实现线程同步,不得不提三点: 2 1)大多数内核对象既有触发也有未触发两个状态 3 比如:进程.线程.作业.文件流.事件.可等待的计时器.信号量.互斥量 4 2)等待函数:等待函数使线程自愿进入等待状态,直到指定的内核对象变为触发状态为止, 5 说道等待我们最喜欢不过了,因为这样不会浪费我们宝贵的CPU时间. 6 3)对于自动重置对象来说,当对象被触发时,函数会自动检测到(手动重置对象为触发是,函数也能检测到), 7 并开始执行,但是在函数会在返回之前使事件变为非触发状态. 8