线程锁的概念函数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: ...
随机推荐
- LA - 4043 - Ants
题意:n只蚂蚁,n棵树,每只蚂蚁要连一棵树,连线(直线)不能相交,给出n只蚂蚁和n棵树的坐标,输出n只蚂蚁所配对的树的编号(1 <= n <= 100, -10000 <= 坐标x, ...
- swt,jface,rcp
//swt-jface-rcp,基本结构:display类,shell类,组件:widget窗口控件,control控件,composites面板,button,label,text文本框,list列 ...
- 《转》如何成为一个牛逼的C/C++程序员?
原地址:http://blog.csdn.net/langeldep/article/details/6333562 这个题目的噱头太大,要真的写起来, 足够写一本书了. 本人是过来人, 结合自身的体 ...
- nginx 区分pc和mobile 到不同的404页面
if ($http_user_agent ~* '(Android|webOS|iPhone|iPod|BlackBerry|vivo)') { set $mobile_request '1'; } ...
- POJ 3040 Allowance 贪心
这题目的贪心思路还是有一点细节问题的. 还没有证明,据说是因为题目给的条件是每个价格是比它小的价格的倍数才能这么贪心的. 思路如下: 假设要给奶牛的钱为C 1)从大面值到小面值一次拿钱,能拿多少拿多少 ...
- Mono和Jexus并且部署ASP.NET MVC3、4、5和WebApi
Linux(CentOS 6.7)下配置Mono和Jexus并且部署ASP.NET MVC3.4.5和WebApi(跨平台) 1.开篇说明 a. 首先我在写这篇博客之前,已经在自己本地配置了mono和 ...
- OCP读书笔记(9) - 诊断数据库
数据库恢复顾问 Data Recovery Advisor的命令行选项 1. 启动 RMAN 进程并连接到目标$ rman target=/ 2. 假设发生了某个错误,希望找出原因,使用 list f ...
- matlab矩阵的表示和简单操作
原地址:http://www.cnblogs.com/Ran_Ran/archive/2010/12/11/1903070.html 一.矩阵的表示在MATLAB中创建矩阵有以下规则: a.矩阵元素必 ...
- Keil - 编译错误总结 01
Keil 编译 STM32project,出现下述错误. 并且. Options for Target -> Output - Browse Information 选项无法勾选. ...
- 我写过的软件之FileExpert
公司要做一个项目,跟MP4有点关系.到网上找了规范文档看了看,理解还是不够深入.干脆花点时间做一个Parser.取名FileExpert.眼下仅仅支持解析ISO_IEC_14496-12的文件格式.取 ...