事件是一个内核事件,内核事件是什么呢,我理解也不深入也不好说,暂且理解为一个内核维护的数据类型吧通过内核事件同步主要

的方法是对事件的信号有和无来进行同步。

比如当我们一个线程进入一段临界代码(独占代码段,不可多个线程同时访问)那么这时候我们将事件对象设置为无信号状态。那么另外

一个线程便会在等待这样一个事件对象,直到该事件对象执行完临界代码,然后将事件对象设为有信号状态,此时便可以该线程便可进

入临界代码段。

 

利用事件对象进行同步主要有以下几个API;

该函数用于创建一个匿名的事件对象,返回值为创建的事件对象

第一个参数为安全属性,当为NULL,设置为默认安全属性

第二个参数为手动或自动改变时间对象的信号状态。TRUE为手动。FALSE为自动

第三个参数为事件对象的初始化状态,TRUE为初始有信号状态,FALSE为初始无信号状态

第四个是事件对象的名称,NULL说明未匿名事件对象

一般情况下,我们选择创建一个默认安全属性,手工置位,初始为有信号状态,未命名的事件对象

该函数将事件对象置为有信号状态,成功则返回非零值,失败则返回零值。

该函数将事件对象置为无信号状态,成功则返回非零值,失败则返回零值

关闭事件对象,在程序结束之前。

该函数用于等待事件对象是否为有信号状态,如果为信号状态则返回,否则一直阻塞。其传入连个参数一个是事件对象,一个是超时

间隔。当第二个参数为INFINITE的时候该函数将一直阻塞知道事件被置为有信号状态。

我们还是以典型的卖票的例子来进行测试,代码实现如下:

  1. #include <windows.h>
  2. #include <stdio.h>
  3.  
  4. static int number=;
  5. HANDLE SigHand;
  6.  
  7. DWORD WINAPI ThreadOne(LPVOID lpParameter)
  8. {
  9. printf("窗口1售票开始:\n");
  10. while()
  11. {
  12. WaitForSingleObject(SigHand,INFINITE);
  13. ResetEvent(SigHand);
  14. if(number>)
  15. {
  16. printf("窗口1售出第%d张票...\n",number);
  17. number--;
  18. Sleep();
  19. }
  20. SetEvent(SigHand);
  21. Sleep();
  22. }
  23. return ;
  24. }
  25. DWORD WINAPI ThreadTwo(LPVOID lpParameter)
  26. {
  27. printf("窗口2售票开始:\n");
  28. while()
  29. {
  30. WaitForSingleObject(SigHand,INFINITE);
  31. ResetEvent(SigHand);
  32. if(number>)
  33. {
  34. printf("窗口2售出第%d张票...\n",number);
  35. Sleep();
  36. number--;
  37. }
  38. SetEvent(SigHand);
  39. Sleep();
  40. }
  41. return ;
  42. }
  43.  
  44. int main()
  45. {
  46. HANDLE HOne,HTwo;
  47.  
  48. printf("***********************vpoet******************\n");
  49. HOne=CreateThread(NULL,,ThreadOne,NULL,,NULL);
  50. HTwo=CreateThread(NULL,,ThreadTwo,NULL,,NULL);
  51. SigHand=CreateEvent(NULL,TRUE,TRUE,NULL);
  52. CloseHandle(HOne);
  53. CloseHandle(HTwo);
  54. while(TRUE)
  55. {
  56. if(number==)
  57. {
  58. printf("不好意思,票卖完了!\n");
  59. CloseHandle(SigHand);
  60. return ;
  61. }
  62. else
  63. {
  64. continue;
  65. }
  66. }
  67.  
  68. return ;
  69. }

运行截图:

Windows多线程同步系列之三-----事件对象的更多相关文章

  1. Windows多线程同步系列之一-----互斥对象

    多线程同步之互斥对象 作者:vpoet mail:vpoet_sir@163.com   对卖票问题进行线程间同步,本文将在上文的基础上,使用互斥对象对线程进行同步. 首先看看windows API ...

  2. Windows多线程同步系列之二-----关键区

    关键区对象为:CRITICAL_SECTION 当某个线程进入关键区之后,其他线程将阻塞等待,知道该线程释放关键区的拥有权. 关键区同步主要有以下几个API 初始化关键区对象,无返回值,传入一个关键区 ...

  3. Windows多线程同步系列之四-----信号量

    信号量说实话自己没怎么使用过.书上大概这样说,信号量设置一个资源访问计数.当该计数值大于0的时候,该信号量对象 为有信号状态,当该计数值等于0的时候,该信号量对象为无信号状态. 我们来查几个主要的AP ...

  4. 总结windows多线程同步互斥

    windows多线程同步互斥--总结 我的windows多线程系列文章: windows多线程--原子操作 windows多线程同步--事件 windows多线程同步--互斥量 windows多线程同 ...

  5. windows多线程同步互斥--总结

    我的windows多线程系列文章: windows多线程--原子操作 windows多线程同步--事件 windows多线程同步--互斥量 windows多线程同步--临界区 windows多线程同步 ...

  6. windows多线程同步--临界区

    推荐参考博客:秒杀多线程第五篇 经典线程同步 关键段CS   关于临界区的观念,一般操作系统书上面都有. 适用范围:它只能同步一个进程中的线程,不能跨进程同步.一般用它来做单个进程内的代码快同步,效率 ...

  7. windows多线程同步

    概述 任何单个应用程序都不能完全使该处理器达到满负荷.当一个线程遇到较长等待时间事件时,同步多线程还允许另一线程中的指令使用所有执行单元.例如,当一个线程发生高速缓存不命中,另一个线程可以继续执行.同 ...

  8. windows多线程同步总结

    1.多线程同步与多线程互斥的关系 其实这也是我一直困扰的问题,在这里我只是说说我的理解.我的理解是多线程互斥是针对于多线程资源而言的. 而多线程同步是针对于多线程时序问题.由于线程的并发性导致其运行时 ...

  9. windows多线程(七) 事件event

    前面说的互斥量Mutex与关键段CriticalSection都不能实现线程的同步,只能实现互斥,接下来我们用时间event就可以实现线程的同步了,事件也是一个内核对象. 一.相关函数说明 (一) 创 ...

随机推荐

  1. unix c 06

    文件操作 fcntl-> 复制文件描述符/取文件状态/文件锁 文件一系列函数-> access/chmod/truncate/... 目录操作 相关函数:mkdir/rmdir/telld ...

  2. html 表单初步学习

    <html> <head> <title> 静态页面</title> </head> <body> 这是一个静态页面<br ...

  3. IO模型总结

    总结 幽默讲解 linux 的 Socket IO 模型(上)

  4. ajax的封装

    ajax是前端工程中与后台进行数据交互的一门重要技术,通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新.这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新.jquer ...

  5. QT绘制系统简介

    #3个类:QPainter,QPainterDevice 和 QPaintEngine 三个类 #qpainter用于执行绘制操作 #QPainterDevice是一个二维空间抽象,允许qpainte ...

  6. 多线程下不反复读取SQL Server 表的数据

    在进行一些如发送短信.邮件的业务时,我们常常会使用一个表来存储待发送的数据,由后台多个线程不断的从表中读取待发送的数据进行发送.发送完毕后再将数据转移到历史表中,这样保证待发送表的数据普通情况下不会太 ...

  7. 2014 BDTC 參会有感

    中国大数据技术大会(Big Data Technology Conference,BDTC)是眼下国内最具影响.规模最大的大数据领域的技术盛会. 大会的前身是Hadoop中国云计算大会(Hadoop ...

  8. [HeadFirst-HTMLCSS学习笔记][第八章扩大你的词汇量]

    字体 font-family,可指定多个候选 body{ font-family:Verdana,Geneva,Arial,sans-serif; } font-size 字体大小 body{ fon ...

  9. NFinal学习笔记 03—代码生成器

    NFinal代码生成器与其他的代码生成器不太一样,只需要运行模块下的WebComplier.aspx即可生成最终的web层代码.包括数据库的操作,Router类, 调试文件等.附上一段代码与大家分享 ...

  10. Repeater里面加上if判断

    //创建时绑定 protected void ItemCreated(object sender, RepeaterItemEventArgs e) { if (e.Item.DataItem != ...