线程锁的概念函数EnterCriticalSection和LeaveCriticalSection的使用方法
线程锁的概念函数EnterCriticalSection和LeaveCriticalSection的使用方法
注:使用结构CRITICAL_SECTION 需增加头文件#include “afxmt.h”
定义一个全局的锁 CRITICAL_SECTION的实例
和一个静态全局变量
- CRITICAL_SECTION cs;//能够理解为锁定一个资源
- static;//定义一个静态的所有变量n_AddValue
创建两个线程函数,代码实现例如以下:
- //第一个线程
- UINT FirstThread(LPVOID lParam)
- {
- EnterCriticalSection(&cs);//加锁 接下来的代码处理过程中不同意其它线程进行操作,除非遇到LeaveCriticalSection
- ; i++){
- n_AddValue ++;
- cout << "n_AddValue in FirstThread is "<<n_AddValue <<endl;
- }
- LeaveCriticalSection(&cs);//解锁 到EnterCriticalSection之间代码资源已经释放了,其它线程能够进行操作
- ;
- }
- //第二个线程
- UINT SecondThread(LPVOID lParam)
- {
- EnterCriticalSection(&cs);//加锁
- ; i++){
- n_AddValue ++;
- cout << "n_AddValue in SecondThread is "<<n_AddValue <<endl;
- }
- LeaveCriticalSection(&cs);//解锁
- ;
- }
在主函数加入下面代码
- int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
- {
- ;
- // 初始化 MFC 并在失败时显示错误
- ))
- {
- // TODO: 更改错误代码以符合您的须要
- _tprintf(_T("错误: MFC 初始化失败/n"));
- ;
- }
- else
- {
- InitializeCriticalSection(&cs);//初始化结构CRITICAL_SECTION
- CWinThread *pFirstThread,*pSecondThread;//存储函数AfxBeginThread返回的CWinThread指针
- pFirstThread = AfxBeginThread(FirstThread,LPVOID(NULL));//启动第一个线程
- pSecondThread = AfxBeginThread(SecondThread,LPVOID(NULL));//启动第二个线程
- ];//
- ] = pFirstThread->m_hThread;
- ] = pSecondThread->m_hThread;
- //等待线程返回
- ,hThreadHandle,TRUE,INFINITE);
- }
- return nRetCode;
- }
输出:
n_AddValue in FirstThread is 1
n_AddValue in FirstThread is 2
n_AddValue in FirstThread is 3
n_AddValue in FirstThread is 4
n_AddValue in FirstThread is 5
n_AddValue in FirstThread is 6
n_AddValue in FirstThread is 7
n_AddValue in FirstThread is 8
n_AddValue in FirstThread is 9
n_AddValue in FirstThread is 10
n_AddValue in SecondThread is 11
n_AddValue in SecondThread is 12
n_AddValue in SecondThread is 13
n_AddValue in SecondThread is 14
n_AddValue in SecondThread is 15
n_AddValue in SecondThread is 16
n_AddValue in SecondThread is 17
n_AddValue in SecondThread is 18
n_AddValue in SecondThread is 19
n_AddValue in SecondThread is 20
假设把两个线程函数中的EnterCriticalSection和LeaveCriticalSection位置移到for循环中去,线程的运行顺序将会改变
输出也就跟着改变,如:
- //第一个线程
- UINT FirstThread(LPVOID lParam)
- {
- ; i++){
- EnterCriticalSection(&cs);//加锁 锁移到for循环内部里
- n_AddValue ++;
- cout << "n_AddValue in FirstThread is "<<n_AddValue <<endl;
- LeaveCriticalSection(&cs);//解锁
- }
- ;
- }
- //第二个线程
- UINT SecondThread(LPVOID lParam)
- {
- ; i++){
- EnterCriticalSection(&cs);//加锁
- n_AddValue ++;
- cout << "n_AddValue in SecondThread is "<<n_AddValue <<endl;
- LeaveCriticalSection(&cs);//解锁
- }
- ;
- }
其它代码不变,输出的结果例如以下:
n_AddValue in FirstThread is 1
n_AddValue in SecondThread is 2
n_AddValue in FirstThread is 3
n_AddValue in SecondThread is 4
n_AddValue in FirstThread is 5
n_AddValue in SecondThread is 6
n_AddValue in FirstThread is 7
n_AddValue in SecondThread is 8
n_AddValue in FirstThread is 9
n_AddValue in SecondThread is 10
n_AddValue in FirstThread is 11
n_AddValue in SecondThread is 12
n_AddValue in FirstThread is 13
n_AddValue in SecondThread is 14
n_AddValue in FirstThread is 15
n_AddValue in SecondThread is 16
n_AddValue in FirstThread is 17
n_AddValue in SecondThread is 18
n_AddValue in FirstThread is 19
n_AddValue in SecondThread is 20
个人觉得在函数EnterCriticalSection和LeaveCriticalSection中间的代码运行过程不会被其它线程干拢或者这么讲不同意其它线程中
的代码运行。这样能够有效防止一个全局变量在两个线程中同一时候被操作的可能性
线程锁的概念函数EnterCriticalSection和LeaveCriticalSection的使用方法的更多相关文章
- Python GIL、线程锁、信号量及事件
GIL是什么? GIL并不是Python的特性,它是在实现Python解析器(CPython)时所引入的一个概念.就好比C++是一套语言(语法)标准,但是可以用不同的编译器来编译成可执行代码.有名的编 ...
- AtomicInteger如何保证线程安全以及乐观锁/悲观锁的概念
众所周知,JDK提供了AtomicInteger保证对数字的操作是线程安全的,线程安全我首先想到了synchronized和Lock,但是这种方式又有一个名字,叫做互斥锁,一次只能有一个持有锁的线程进 ...
- 第一节:《线程安全和锁Synchronized概念》
第一节:线程安全和锁Synchronized概念 一.进程与线程的概念 (1)在传统的操作系统中,程序并不能独立运行,作为资源分配和独立运行的基本单位都是进程. 在未配置 OS 的系统中,程序的执行方 ...
- day9---多线程,线程锁,队列
进程.线程 http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html 使用threading模块实现多线程编程[综述] Pyt ...
- java 并发性和多线程 -- 读感 (一 线程的基本概念部分)
1.目录略览 线程的基本概念:介绍线程的优点,代价,并发编程的模型.如何创建运行java 线程. 线程间通讯的机制:竞态条件与临界区,线程安全和共享资源与不可变性.java内存模型 ...
- [python] 线程锁
参考:http://blog.csdn.net/kobeyan/article/details/44039831 1. 锁的概念 在python中,存在GIL,也就是全局解释器锁,能够保证同一时刻只有 ...
- Python 第八篇:异常处理、Socket语法、SocketServer实现多并发、进程和线程、线程锁、GIL、Event、信号量、进程间通讯
本节内容: 异常处理.Socket语法.SocketServer实现多并发.进程和线程.线程锁.GIL.Event.信号量.进程间通讯.生产者消费者模型.队列Queue.multiprocess实例 ...
- iOS 多线程之线程锁Swift-Demo示例总结
线程锁是什么 在前面的文章中总结过多线程,总结了多线程之后,线程锁也是必须要好好总结的东西,这篇文章构思的时候可能写的东西得许多,只能挤时间一点点的慢慢的总结了,知道了线程之后要了解线程锁就得先了解一 ...
- python 线程/线程锁/信号量
单线程 #常规写法 import threading import time def sayhi(num): # 定义每个线程要运行的函数 print("running on number: ...
随机推荐
- 让AllocateHwnd接受一般函数地址作参数(105篇博客)
http://www.xuebuyuan.com/1889769.html Classes单元的AllocateHWnd函数是需要传入一个处理消息的类的方法的作为参数的,原型: function Al ...
- Ogre嵌入MFC傻瓜全然教程(三)
经过前两两篇博文的解说.我们已经完毕了渲染工作,但仅仅是渲染而没有交互性,本篇博文我们就来加上事件的处理方法. 首先我们须要为项目加入一个帧监听类:CMyFrameListener,为了直观,在这直接 ...
- 如何关闭android studio开发环境自动保存
使用DW习惯了现在转到学习开发android,请问怎样关闭android studio的自动保存功能,然后按ctrl+s进行保存,因为有时候代码不想让其保存,他也自动保存了. File -> S ...
- DLNA_百度百科
DLNA_百度百科 DLNA
- iOS8指纹识别TouchID
苹果在2014年6月3日的WWDC2014开幕式上推出了新版iOS8系统,界面上iOS8与iOS7相比变化不大,只是在功能方面进行了完好.iOS8通知中心更加强大,支持消息直接回复操作,并支持Quic ...
- iOS视图控制器之间delegate传值教程
之前在StackOverFlow上看到一篇讲传值(segue传值和delegate传值)的文章,感觉讲的非常清晰,就将delegate部分翻译了一下.有兴趣能够看看. 原文: http://stack ...
- Facial Landmark Detection
源地址:http://www.learnopencv.com/facial-landmark-detection/#comment-2471797375 OCTOBER 18, 2015 BY SAT ...
- [Android学习笔记]View的measure过程学习
View从创建到显示到屏幕需要经历几个过程: measure -> layout -> draw measure过程:计算view所占屏幕大小layout过程:设置view在屏幕的位置dr ...
- 一个Java对象到底占多大内存?(转)
最近在读<深入理解Java虚拟机>,对Java对象的内存布局有了进一步的认识,于是脑子里自然而然就有一个很普通的问题,就是一个Java对象到底占用多大内存? 在网上搜到了一篇博客讲的非常好 ...
- Fragment总结
一.总体工程图: 二.main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android& ...