C++多线程中用临界区控制全局变量的访问冲突问题
困扰了我很长时间的多线程访问全局变量今天终于解决了,所以得记录一下。。控制全局变量的方法很多,有信号量、临界区等。。这里我记录一个用临界区控制访问冲突的例子。非常好用。
- #include <windows.h>
- #include <iostream>
- using namespace std;
- //首先做两个线程,实现两个线程间的同步 上次是利用互斥对象实现线程间的同步CreateMutex函数和事件对象间的同步CreateEvent函数,这次用关键代码段(临界区对象)来实现
- DWORD WINAPI Fun1Proc(LPVOID lpParameter);
- DWORD WINAPI Fun2Proc(LPVOID lpParameter);
- int tickets=;
- CRITICAL_SECTION g_cs; //1.定义一个临界区对象
- void main()
- {
- HANDLE hThread1;
- HANDLE hThread2;
- hThread1=CreateThread(NULL,,Fun1Proc,NULL,,NULL);
- hThread2=CreateThread(NULL,,Fun2Proc,NULL,,NULL);
- CloseHandle(hThread1);
- CloseHandle(hThread2);
- InitializeCriticalSection(&g_cs); //2.初始化临界对象
- Sleep();
- DeleteCriticalSection(&g_cs); //3.当函数要结束的时候释放所有没有被拥有的临界区对象相关的成员
- }
- DWORD WINAPI Fun1Proc(LPVOID lpParameter)
- {
- while(TRUE)
- {
- EnterCriticalSection(&g_cs); //4.判断是否有线程在访问公共资源,如果有线程正在访问就,不能执行下面的
- if(tickets>)
- {
- Sleep();
- cout<<"Thread1 sell tickets:"<<tickets--<<endl;
- }
- else
- break;
- LeaveCriticalSection(&g_cs); //5.执行完代码段的就离开临界区,那么下个线程就可以访问资源了,这就好像我们要用公用电话(共有资源),我们必须先看看电话厅里是否有人,有人就不能此时用,没人就可以用这个资源了
- }
- //7.注意一定要释放,否则线程2就没有执行的机会 “谁拥有谁释放”
- return ;
- }
- DWORD WINAPI Fun2Proc(LPVOID lpParameter)
- {
- while(TRUE)
- {
- EnterCriticalSection(&g_cs);
- if(tickets>)
- {
- Sleep();
- cout<<"Thread2 sell tickets:"<<tickets--<<endl;
- }
- else
- break;
- LeaveCriticalSection(&g_cs); //8.我们可以将线程2注释起来看看,运行发现,线程1卖出第100张后不再卖了,其余的都是线程2卖的
- }
- return ; //6.程序这样执行,同步建立了。没有出现重复和0的票号
- }
C++多线程中用临界区控制全局变量的访问冲突问题的更多相关文章
- 【转】Java多线程操作局部变量与全局变量
原文网址:http://blog.csdn.net/undoner/article/details/12849661 在这篇文章里,我们首先阐述什么是同步,不同步有什么问题,然后讨论可以采取哪些措施控 ...
- Java多线程操作局部变量与全局变量
在这篇文章里,我们首先阐述什么是同步,不同步有什么问题,然后讨论可以采取哪些措施控制同步,接下来我们会仿照回顾网络通信时那样,构建一个服务器端的"线程池",JDK为我们提供了一个很 ...
- 多线程相关------临界区CriticalSection
多线程一直是短板,整理相关知识方便查询 临界区(Critical Section) 临界区是一段供线程独占式访问的代码.在任意时刻,若有一个线程正在访问该代码段,如果其他所有试图访问的线程都将被挂起, ...
- windows多线程同步--临界区
推荐参考博客:秒杀多线程第五篇 经典线程同步 关键段CS 关于临界区的观念,一般操作系统书上面都有. 适用范围:它只能同步一个进程中的线程,不能跨进程同步.一般用它来做单个进程内的代码快同步,效率 ...
- 多线程编程_控制并发线程数的Semaphore
简介 Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源.很多年以来,我都觉得从字面上很难理解Semaphore所表达的含义,只能把它比作是 ...
- Volatile 多线程中用到的关键字
前言 不管是在面试还是实际开发中 volatile 都是一个应该掌握的技能. 首先来看看为什么会出现这个关键字. 内存可见性 由于 Java 内存模型(JMM)规定,所有的变量都存放在主内存中,而每个 ...
- C# 多线程之线程控制
方案一: 调用线程控制方法.启动:Thread.Start();停止:Thread.Abort();暂停:Thread.Suspend();继续:Thread.Resume(); private vo ...
- 多线程并发流程控制之dispatch_group 有关函数
A B C D 4个并发下载任务,怎样在第一时间知道任务全部完成? dispatch_group 可以帮我们实现这样的控制. 上代码,看说明. dispatch_group_t group = dis ...
- Java多线程学习(四)---控制线程
控制线程 摘要: Java的线程支持提供了一些便捷的工具方法,通过这些便捷的工具方法可以很好地控制线程的执行 1. join线程控制,让一个线程等待另一个线程完成的方法 2. 后台线程,又称为守护线程 ...
随机推荐
- 聚簇索引(聚集索引) 不可作用于GUID类型字段
聚簇索引(又名聚集索引) 不可作用于GUID类型字段,即:数据库中不要把GUID类型作为主键或设置为聚集索引. 聚集索引:索引的物理存储顺序与数据表中行数据物理存储顺序一致(索引存储物理有序). 非聚 ...
- Java文件编译出现 “编码 GBK 的不可映射字符”
俗话说,温故而知新.本打算用dos回忆一下基础知识,没想到把自己绊倒了. 用Dos,当然就要回归原始,用记事本啦.下面用一个小练习,演示我遇到的绊脚石.之后,解决了简直笑死. 报错: Java文件编译 ...
- canvas-6font.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- canvas-tangram.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 通过PHP来 获取文件内容 并且分割字符串 呈现在表格中
<?php $aaa = file_get_contents("names.txt"); $data = explode("\n", $aaa); for ...
- 【代码笔记】Web-HTML-列表
一,效果图. 二,代码. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...
- WebLogic 11g的安装与配置详谈配置详谈
之前以weblogic8.1为例介绍了其具体安装,但是由于现在weblogic 11g毕竟使用越来越广泛 ,因此,下面将介绍weblogic 11g的具体安装以及配置: 一.安装步骤(基本跟之前we ...
- Jenkins 开启用户注册机制及用户权限设置
Jenkins 开启用户注册机制及用户权限设置 by:授客 QQ:1033553122 步骤 1. 系统管理-Configure Global Security 2. 设置
- beego+vue父子组件通信(父子页面传值、父子组件传值、父子路由传值)
场景:有head和foot,为父组件 侧栏tree为子组件 点击tree,右侧孙组件根据点击tree的id,来更改表格内容. 首先是父子(本例中是子组件与孙组件)通信,目前是父传到子,暂时还没有子传到 ...
- 什么是DDoS攻击?DDoS防御的11种方针详解
对于遭受DDOS攻击的情况是让人很尴尬的,如果我们有良好的DDoS防御方法,那么很多问题就将迎刃而解,我们来看看我们有哪些常用的有效地方法来做好DDoS防御呢. 对于DDoS防御的理解: 对付DDOS ...