困扰了我很长时间的多线程访问全局变量今天终于解决了,所以得记录一下。。控制全局变量的方法很多,有信号量、临界区等。。这里我记录一个用临界区控制访问冲突的例子。非常好用。

#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++多线程中用临界区控制全局变量的访问冲突问题的更多相关文章

  1. 【转】Java多线程操作局部变量与全局变量

    原文网址:http://blog.csdn.net/undoner/article/details/12849661 在这篇文章里,我们首先阐述什么是同步,不同步有什么问题,然后讨论可以采取哪些措施控 ...

  2. Java多线程操作局部变量与全局变量

    在这篇文章里,我们首先阐述什么是同步,不同步有什么问题,然后讨论可以采取哪些措施控制同步,接下来我们会仿照回顾网络通信时那样,构建一个服务器端的"线程池",JDK为我们提供了一个很 ...

  3. 多线程相关------临界区CriticalSection

    多线程一直是短板,整理相关知识方便查询 临界区(Critical Section) 临界区是一段供线程独占式访问的代码.在任意时刻,若有一个线程正在访问该代码段,如果其他所有试图访问的线程都将被挂起, ...

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

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

  5. 多线程编程_控制并发线程数的Semaphore

    简介 Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源.很多年以来,我都觉得从字面上很难理解Semaphore所表达的含义,只能把它比作是 ...

  6. Volatile 多线程中用到的关键字

    前言 不管是在面试还是实际开发中 volatile 都是一个应该掌握的技能. 首先来看看为什么会出现这个关键字. 内存可见性 由于 Java 内存模型(JMM)规定,所有的变量都存放在主内存中,而每个 ...

  7. C# 多线程之线程控制

    方案一: 调用线程控制方法.启动:Thread.Start();停止:Thread.Abort();暂停:Thread.Suspend();继续:Thread.Resume(); private vo ...

  8. 多线程并发流程控制之dispatch_group 有关函数

    A B C D 4个并发下载任务,怎样在第一时间知道任务全部完成? dispatch_group 可以帮我们实现这样的控制. 上代码,看说明. dispatch_group_t group = dis ...

  9. Java多线程学习(四)---控制线程

    控制线程 摘要: Java的线程支持提供了一些便捷的工具方法,通过这些便捷的工具方法可以很好地控制线程的执行 1. join线程控制,让一个线程等待另一个线程完成的方法 2. 后台线程,又称为守护线程 ...

随机推荐

  1. Gauss-Laguerre quadrature rule

    % matlab script to derive the 2-point Gauss-Laguerre quadrature rule % and use it on an example % in ...

  2. Matlab illustrate stiffness

    % matlab script to illustrate stiffness % using simple flame propagation model close all clear all % ...

  3. 在使用vue-cli中遇到的几个问题

    前言:框架没有好坏之分,能解决需求就可以.之前没事用vue模仿过BOSS直聘App(纯属娱乐),实际工作中开发过一个后台管理系统,遇到过不少坑,终于闲下来稍微总结几个问题分享一下! 一.所遇到的问题( ...

  4. JS的分号可以省掉吗?

    摘要: JavaScript语言从设计之初就是考虑带分号的,使用不带分号的编码规则就要小心点啦. 背景 最近在项目中开始使用新的编码规范,一开始ESLint报一大堆错误,改得我想砸键盘,花了好些时间才 ...

  5. blfs(systemv版本)学习笔记-使用apache创建简单的网页服务器

    我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! apache项目地址:http://www.linuxfromscratch.org/blfs/view/stable/serv ...

  6. CSS3属性-webkit-font-smoothing字体抗锯齿渲染

    对字体进行抗锯齿渲染可以使字体看起来会更清晰舒服.在图标字体成为一种趋势的今天,抗锯齿渲染使用也越来越多. font-smoothing是非标准的CSS定义.它被列入标准规范的草案中,后由于某些原因从 ...

  7. 【代码笔记】Web-手机端的meta

    一,天猫 <title>天猫触屏版</title> <meta content="text/html; charset=utf-8" http-equ ...

  8. 谷歌迂回入华:Waymo无人车抢先进驻上海!

    谷歌迂回入华:Waymo无人车抢先进驻上海! https://mp.weixin.qq.com/s/d5Cw2uhykMJ9urb6Cs8aNw 谷歌又双叒叕要回归中国了?这已经是第不知道多少次的传言 ...

  9. 测试思想-集成测试 关于接口测试 Part1

    关于接口测试 by:授客 QQ:1033553122 接口定义 接口泛指实体把自己提供给外界的一种抽象化物,用以由内部操作分离出外部沟通方法,使其能被修改内部而不影响外界其他实体与其交互的方式. 举例 ...

  10. JS笔记(三):数组、函数、类

    (一) 数组 //创建数组 var the_array = [1,2,3,4,'5'] console.log(the_array[0]) //读取索引为0的数据 the_array[5] = '赋值 ...