热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

多线程同步系列之二关键区

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

关键区对象为:CRITICAL_SECTION 当某个线程进入关键区之后,其他线程将

阻塞等待,知道该线程释放关键区的拥有权。

关键区同步主要有以下几个API

技术分享

初始化关键区对象,无返回值,传入一个关键区对象的指针。

技术分享

该函数在使用完关键区之后删除关键区对象,无返回值,同样传入一个关键区对象指针

技术分享

该函数为进入关键区函数,传入的参数为关键区对象指针,无返回值。如果另外一个线程正拥有关键区的所有

权,那么该函数将阻塞,直到其他线程释放关键区的所有权之后,该函数才能继续执行进入关键区。

技术分享

该函数与EnterCriticalSection正好相反,EnterCriticalSection是获取关键区所有权进入关键区,

而LeaveCriticalSection是释放关键区所有权,离开关键区。

我们下面还是继上一文多线程同步系列之一-----互斥对象中同步卖票的例子进行续写。

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

运行截图:

技术分享

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


推荐阅读
  • 蒜头君的倒水问题(矩阵快速幂优化)
    蒜头君将两杯热水分别倒入两个杯子中,每杯水的初始量分别为a毫升和b毫升。为了使水冷却,蒜头君采用了一种特殊的方式,即每次将第一杯中的x%的水倒入第二杯,同时将第二杯中的y%的水倒入第一杯。这种操作会重复进行k次,最终求出两杯水中各自的水量。 ... [详细]
  • 经过一年的思考,我发现自己对开发的兴趣并不浓厚,而对算法研究则更加热衷。本文将探讨开发与算法之间的本质差异,并分享我的未来学习计划。 ... [详细]
  • 本文介绍了Java编程语言的基础知识,包括其历史背景、主要特性以及如何安装和配置JDK。此外,还详细讲解了如何编写和运行第一个Java程序,并简要介绍了Eclipse集成开发环境的安装和使用。 ... [详细]
  • Bootstrap 缩略图展示示例
    本文将展示如何使用 Bootstrap 实现缩略图效果,并提供详细的代码示例。 ... [详细]
  • 本文介绍了一种支付平台异步风控系统的架构模型,旨在为开发类似系统的工程师提供参考。 ... [详细]
  • 本文介绍了多种开源数据库及其核心数据结构和算法,包括MySQL的B+树、MVCC和WAL,MongoDB的tokuDB和cola,boltDB的追加仅树和mmap,levelDB的LSM树,以及内存缓存中的一致性哈希。 ... [详细]
  • NX二次开发:UFUN点收集器UF_UI_select_point_collection详解
    本文介绍了如何在NX中使用UFUN库进行点收集器的二次开发,包括必要的头文件包含、初始化和选择点集合的具体实现。 ... [详细]
  • 解决SQL Server数据库sa登录名无法连接的问题
    在安装SQL Server数据库后,使用Windows身份验证成功,但使用SQL Server身份验证时遇到问题。本文将介绍如何通过设置sa登录名的密码、启用登录名状态以及开启TCP协议来解决这一问题。 ... [详细]
  • MySQL 数据库连接方法
    本文介绍了如何使用 MySQL 命令行工具连接到指定的数据库。 ... [详细]
  • 如何解决8080端口被占用问题
    本文介绍了如何通过命令行和任务管理器查找并终止占用8080端口的进程,以确保该端口能够正常使用。 ... [详细]
  • Excel 数据分析基础
    Excel 是数据分析中最基本且强大的工具之一,具备多种实用功能和操作方法。本文将简要介绍 Excel 的不同版本及其兼容性问题,并探讨在处理大数据时的替代方案。 ... [详细]
  • 本文介绍了如何在 ASP.NET 中设置 Excel 单元格格式为文本,获取多个单元格区域并作为表头,以及进行单元格合并、赋值、格式设置等操作。 ... [详细]
  • LDAP服务器配置与管理
    本文介绍如何通过安装和配置SSSD服务来统一管理用户账户信息,并实现其他系统的登录调用。通过图形化交互界面配置LDAP服务器,确保用户账户信息的集中管理和安全访问。 ... [详细]
  • 如果应用程序经常播放密集、急促而又短暂的音效(如游戏音效)那么使用MediaPlayer显得有些不太适合了。因为MediaPlayer存在如下缺点:1)延时时间较长,且资源占用率高 ... [详细]
  • 网络爬虫的规范与限制
    本文探讨了网络爬虫引发的问题及其解决方案,重点介绍了Robots协议的作用和使用方法,旨在为网络爬虫的合理使用提供指导。 ... [详细]
author-avatar
你不知道的人
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有