016 内核对象的Signal状态3

Signal
  ● Signal = FALSE 相当于标志
  ● 进程 初始化FALSE 运行完成 设置位 TURE
  ● 线程
  ● 标准输入输出流
  ● 互斥体
  ● 信号
  ● 可等待计时器
  ● 作业
  ● WaitForSingleObject() 句柄,时间
    ○ 当前正在执行的线程,变成不可调度的状态,
    ○ 等待Signal 状态变成 True
    ○ 返回值 WAIT_TIMEOUT 超时
    ○ 返回值 WAIT_FAILED 方法失败 可以使用 GetLastError获取错误
    ○ 返回值 WAIT_OBJECT_0 指定的对象出有有信号状态
    ○ 当hHandle为mutex时,如果拥有mutex的线程在结束时没有释放核心对象会引发此返回值。
  ● WaitForMultipleObjects()等待多个信号状态
  1.等待几个
  2数组
  3是否等待所有
  4等待时间
    ○ 返回值WAIT_OBJECT_0 (WAIT_OBJECT_0 + nCount - 1如果bWaitAll为TRUE),则返回值表明所有指定对象的状态信号。
    ○ 返回值WAIT_ABANDONED_0 (WAIT_ABANDONED_0 + nCount - 1)如果bWaitAll为TRUE,则返回值表明所有指定对象的状态是触发的,并且至少对象之一,是一个废弃的互斥对象。
    ○ 返回值WAIT_TIMEOUTT超时间隔已过
  ● 同步
    ○ 进程和进程之间的同步
    ○ 守护进程 父进程

 1 #define UNICODE
 2 #include <stdio.h>
 3 #include <Windows.h>
 4 #include <process.h>
 5
 6 unsigned __stdcall ThreadFunc(void *lParam)
 7 {
 8     return 0;
 9 }
10
11 int main()
12 {
13     HANDLE hThread = (HANDLE)_beginthreadex(nullptr, 0, ThreadFunc, nullptr, 0, nullptr);
14     //WaitForSingleObject(hThread, INFINITE);    //永远等待 ->30天
15     DWORD dw = WaitForSingleObject(hThread, 1000);
16
17     switch(dw)
18     {
19         case WAIT_TIMEOUT:
20             printf("等待超时!\r\n");
21             break;
22         case WAIT_OBJECT_0:
23             printf("成功等待!\r\n");
24             break;
25         case WAIT_FAILED:
26             break;
27     }
28 }

WaitForMultipleObjects

 1 #define UNICODE
 2 #include <stdio.h>
 3 #include <Windows.h>
 4 #include <process.h>
 5
 6 unsigned __stdcall ThreadFunc(void *lParam)
 7 {
 8     Sleep(2000);
 9     return 0;
10 }
11
12 int main()
13 {
14     HANDLE hThread = (HANDLE)_beginthreadex(nullptr, 0, ThreadFunc, nullptr, 0, nullptr);
15     //WaitForSingleObject(hThread, INFINITE);    //永远等待 ->30天
16     DWORD dw = WaitForSingleObject(hThread, 1000);
17
18     switch(dw)
19     {
20         case WAIT_TIMEOUT:
21             printf("等待超时!\r\n");
22             break;
23         case WAIT_OBJECT_0:
24             printf("成功等待!\r\n");
25             break;
26         case WAIT_FAILED:
27             break;
28     }
29 }

 1 #define UNICODE
 2 #include <stdio.h>
 3 #include <Windows.h>
 4 #include <process.h>
 5
 6 unsigned __stdcall ThreadFunc(void *lParam)
 7 {
 8     Sleep((int)lParam);
 9     return 0;
10 }
11
12 int main()
13 {
14     HANDLE hThread[2] = {INVALID_HANDLE_VALUE};
15     hThread[0] = (HANDLE)_beginthreadex(nullptr, 0, ThreadFunc, (void*)100, 0, nullptr);
16     hThread[1] = (HANDLE)_beginthreadex(nullptr, 0, ThreadFunc, (void*)500, 0, nullptr);
17     //WaitForSingleObject(hThread, INFINITE);    //永远等待 ->30天
18     //DWORD dw = WaitForSingleObject(hThread, 1000);
19     //DWORD dw = WaitForMultipleObjects(2,hThread,FALSE,2000);
20     BOOL bLoop = TRUE;
21     DWORD dwRet = -1;
22     while (bLoop)
23     {
24         dwRet = WaitForMultipleObjects(2,hThread,FALSE,100);
25         DWORD dw = WaitForSingleObject(hThread[1],1);
26         if(dw == WAIT_OBJECT_0)
27         {
28             printf("Thread 2 is Reading.........\r\n");
29         }
30         switch(dwRet)
31         {
32         case WAIT_TIMEOUT:
33             printf("Wait Time Out , Next Check....\r\n");
34             break;
35         case WAIT_OBJECT_0:
36             printf("Thread 1 is OK..........\r\n");
37             break;
38         case WAIT_OBJECT_0 +1:
39             printf("Thread 2 is OK........\r\n");
40             bLoop = FALSE;
41             break;
42         case WAIT_FAILED:
43             printf("Error.........\r\n");
44             break;
45         }
46     }
47     return 0;
48 /*
49     switch(dw)
50     {
51         case WAIT_TIMEOUT:
52             printf("等待超时!\r\n");
53             break;
54         case WAIT_OBJECT_0:
55             printf("成功等待!\r\n");
56             break;
57         case WAIT_FAILED:
58             break;
59     }
60 */
61 }

时间: 2024-12-29 10:03:45

016 内核对象的Signal状态3的相关文章

016 内核对象1

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

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

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

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) == TRU

线程与内核对象的同步

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

内核对象

每个内核对象都只是一个内存块,它由操作系统内核分配,并只能由操作系统内核访问.这个内存块是一个数据结构,其成员维护着与对象相关的信息.少数成员(安全描述符和使用计数)是所有对象都有的,但其他大多数成员都是不同类型的对象特有的 由于内核对象的数据结构只能由操作系统内核访问,所以应用程序不能在内存中定位这些数据结构并直接更改其内容.正因为有这个限制,所以微软能自由地添加.删除或修改这些数据结构中的成员,同时不会干扰任何应用程序的正常运行 为了增强系统的可靠性,内核对象的句柄是与进程相关的.如果进程A

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

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

线程同步——内核对象实现线程同步——信号量

1 /* 2 3 信号量内核对象 4 信号量与其它内核量相同,包含一个使用计数,除此之外还包含两个量. 5 一个最大资源计数和一个当前资源计数. 6 信号量规则如下: 7 如果当前资源计数大于0,那么信号量处于触发状态. 8 如果当前资源计数等于0,那么信号量处于未触发状态. 9 系统绝不会让当前资源计数变为负数. 10 当前资源计数绝不会大于最大资源计数. 11 12 下面我们看一下信号量的创建函数 13 HANDLE CreateSemaphore( 14 LPSECURITY_ATTRIB

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

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

线程同步——内核对象实现线程同步——可等待计时器内核对象

1 可等待计时器 2 可等待计时器是这样一种内核对象,他们会在某个指定的时间触发或每隔一段时间触发一次. 5 下面我们来介绍一下创建可等待计时器函数: 6 7 HANDLE CreateWaitableTimer( 8 LPSECURITY_ATTRIBUTES lpTimerAttributes, 9 BOOL bManualReset, 10 LPCSTR lpTimerName ); 11 第一.三个参数我想我也不用介绍了哈,这是创建内核对象基本都会有的参数. 12 第二个参数bManua