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

  1 事件内核对象
  2
  3 事件类型对象有两种不同类型,手动重置和自动重置
  4 手动重置:当一个手动重置对象被触发时候,等待该对象的所有线程变为可调度。
  5 自动重置:当一个自动重置对象被触发时,只有一个等待该事件的线程会变为可调度
  6
  7 下面是一个创建事件内核对象的函数:
  8 HANDLE CreateEvent(
  9 LPSECURITY_ATTRIBUTES lpEventAttributes,
 10 BOOL   bManualReset,
 11 BOOL   bInitialState,
 12 PCTSTR lpName );
 13
 14 第一、四个参数和创建其它内核对象相似想必已经十分熟悉了。
 15 这里就不介了哈。
 16 第二个参数bManualReset是一个BOOL值,告诉系统是手动重置对象(TRUE),还是自动重置对象(FALSE).
 17 第三个参数bInitialState是将事件初始化为触发状态(TRUE),还是未触发状态(FALSE)
 18
 19 BOOL SetEvent(  HANDLE hEvent ) ;
 20 该函数把事件变为触发状态
 21
 22 BOOL ResetEvent( HANDLE hEvent ) ;
 23 该函数把事件变为未触发状态
 24
 25
 26 使用方法:
 27 1)
 28 //定义一个事件对象1
 29 HANDLE g_hEvent ;
 30
 31 2)
 32 //创建一个手动重置的事件对象,并把事件出事话为触发状态
 33 g_hEvent = CreateEvent(NULL,FALSE,TRUE,NULL);
 34
 35 3)
 36 //在线程中调用
 37 DWORD WINAPI ThreadFunOne(PVOID pvParam)
 38 {
 39 WaitForSingleObject(g_hEvent,INFINITE);
 40 g_x++;
 41
 42 return 0;
 43 }
 44
 45 #include "windows.h"
 46 #include "iostream"
 47 using namespace std;
 48 long g_x = 0 ;
 49
 50 //定义一个事件对象1
 51 HANDLE g_hEvent ;
 52
 53 //定义线程函数1
 54 DWORD WINAPI ThreadFunOne(PVOID pvParam) ;
 55
 56 //定义线程函数2
 57 DWORD WINAPI ThreadFunTwo(PVOID pvParam);
 58
 59 int main()
 60 {
 61
 62     //创建一个手动重置的事件对象,并把事件出事话为触发状态
 63     g_hEvent = CreateEvent(NULL,TRUE,TRUE,NULL);
 64
 65     //把事件设为未触发状态
 66     //    ResetEvent(g_hEvent);
 67
 68     //把事件设为触发状态
 69     //    SetEvent(g_hEvent) ;
 70
 71     //创建线程1
 72     HANDLE hThreadOne = CreateThread(NULL,0,ThreadFunOne,0,0,NULL);
 73     CloseHandle(hThreadOne);
 74
 75     //创建线程2
 76     HANDLE hThreadTwo = CreateThread(NULL,0,ThreadFunTwo,0,0,NULL);
 77     CloseHandle(hThreadTwo);
 78
 79     //让主线程先挂起,确保其它线程执行完成
 80     Sleep(1000);
 81     cout<<g_x<<endl;
 82     return 0 ;
 83 }
 84
 85 DWORD WINAPI ThreadFunOne(PVOID pvParam)
 86 {
 87     WaitForSingleObject(g_hEvent,INFINITE);
 88     g_x++;
 89
 90     return 0;
 91 }
 92
 93 DWORD WINAPI ThreadFunTwo(PVOID pvParam)
 94 {
 95     Sleep(200);
 96     WaitForSingleObject(g_hEvent,INFINITE);
 97     g_x++;
 98
 99     return 0;
100 }

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

时间: 2024-12-18 15:43:08

线程同步——内核对象实现线程同步——事件内核对象的相关文章

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

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

第9章 用内核对象进行线程同步(4)_死锁(DeadLock)及其他

9.7 线程同步对象速查表 对象 何时处于未触发状态 何时处于触发状态 成功等待的副作用 进程 进程仍在运行的时候 进程终止的时(ExitProcess.TerminateProcess) 没有 线程 线程仍在运行的时候 线程终止的时候(ExitThread.TermimateThread) 没有 作业 作业尚未超时的时候 作业超时的时候 没有 文件 有待处理的I/O请求的时候 I/O请求完成的时候 没有 控制台输入 没有输入的时候 有输入的时候 没有 文件变更通知 文件没有变更的时候 文件系统

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

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

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

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

内核对象进行线程同步

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

Windows 互斥对象在线程同步上的运用

互斥对象在线程同步时的使用 1 多线程在资源共享的时候出现的问题 在程序中如果不同线程对同一个对象进行操作的话就有可能出现因为线程切换而导致的问题.例如下面的程序 #include <stdio.h> #include <WinSock2.h> #include <iostream> using namespace std; #pragma comment(lib,"ws2_32.lib") DWORD WINAPIfun1Proc(LPVOID l

VC++多线程编程-线程间的通信和线程同步

引用:http://blog.csdn.net/zjc0888/article/details/7372258 线程间通讯 一般而言,应用程序中的一个次要线程总是为主线程执行特定的任务,这样,主线程和次要线程间必定有一个信息传递的渠道,也就是主线程和次要线程间要进行通信.这种线程间的通信不但是难以避免的,而且在多线程编程中也是复杂和频繁的,下面将进行说明. 使用全局变量进行通信 由于属于同一个进程的各个线程共享操作系统分配该进程的资源,故解决线程间通信最简单的一种方法是使用全局变量.对于标准类型

线程同步——用户模式下线程同步——Interlocked实现线程同步

1 线程同步分为用户模式下的线程同步和内核对象的线程同步. 2 3 当然用户模式下的线程同步实现速度比内核模式下快,但是功能也有局 4 5 6 7 8 //1.利用原子访问: Interlocked系列函数,关于Interlocked系列函数,我需要知道的是他们,执行的极快 9 10 //(1)首先是InterlockedExchangeAdd兄弟函数, 11 //第一个参数 Addend 代表进行操作数的地址, 12 //第二个参数 Value 代表增加的值,如果是想进行减法,传负数即可 13

【同步】孙鑫VC++笔记-事件对象同步

事件对象同步 //CreateEvent设置自定的,并且初始有信号#include<windows.h> #include<iostream.h> DWORD WINAPI ThreadProc1( LPVOID lpParameter ); DWORD WINAPI ThreadProc2( LPVOID lpParameter ); int tickes=100; HANDLE g_hEvent; int main() { HANDLE hThread1=CreateThrea