EnterCriticalSection 如何实现得到锁?

[email protected]:
77E022D0 mov edi,edi
77E022D2 push ebp
77E022D3 mov ebp,esp
77E022D5 sub esp,0Ch
77E022D8 push esi
77E022D9 push edi
77E022DA mov edi,dword ptr [ebp+8]
77E022DD lea esi,[edi+4]
77E022E0 mov eax,esi
77E022E2 lock btr dword ptr [eax],0    //原子查看 LockCount 最低位是否为0, 如果为0, 则认为已经得倒
77E022E7 jae [email protected]+1030Bh (77E125DBh)
77E022ED mov eax,dword ptr fs:[00000018h]
77E022F3 mov ecx,dword ptr [eax+24h]
77E022F6 mov dword ptr [edi+0Ch],ecx    //设置OwningThread
77E022F9 mov dword ptr [edi+8],1          //RecursionCount
77E02300 pop edi
77E02301 xor eax,eax
77E02303 pop esi
77E02304 mov esp,ebp
77E02306 pop ebp
77E02307 ret 4

时间: 2024-10-07 15:06:57

EnterCriticalSection 如何实现得到锁?的相关文章

线程锁的概念函数EnterCriticalSection和LeaveCriticalSection的使用方法

注:使用结构CRITICAL_SECTION 需增加头文件#include “afxmt.h” 定义一个全局的锁 CRITICAL_SECTION的实例和一个静态全局变量 CRITICAL_SECTION cs;//能够理解为锁定一个资源 static int n_AddValue = 0;//定义一个静态的所有变量n_AddValue 创建两个线程函数,代码实现例如以下: //第一个线程 UINT FirstThread(LPVOID lParam) { EnterCriticalSectio

c++多线程——锁技巧

[转自]here 编写程序不容易,编写多线程的程序更不容易.相信编写过多线程的程序都应该有这样的一个痛苦过程,什么样的情况呢?朋友们应该看一下代码就明白了, void data_process() { EnterCriticalSection(); if(/* error happens */) { LeaveCriticalSection(); return; } if(/* other error happens */) { return; } LeaveCriticalSection();

基于windows api实现的共享锁/独占锁

众所周知,windows平台上实现线程同步.或者说资源的加锁与解锁的方法有内核事件.临界区.相互排斥量.信号量,甚至interlocked系列函数等多种手段. 可是在日常的编程中,我们使用这些手段对 "多个线程同一时候对同一个资源进行读写" 的时候,在读写之前先要对资源假锁,读写完之后要对资源解锁. 设想这样一种情况,有一个ftpserver.每天有非常频繁的对这个ftp服务的文件进行下载,可是差点儿好几天才会对这些文件进行更新.在我们每一次对文件下载的时候,读取文件的时候都要对文件进

一种有效避免死锁的互斥锁设计

下面是摘自网络的一段话,我觉得很好:对认识锁很有帮助. "为什么要加锁?加锁是为了防止不同的线程访问同一共享资源造成混乱. 打个比方:人是不同的线程,卫生间是共享资源. 你在上洗手间的时候肯定要把门锁上吧,这就是加锁,只要你在里面,这个卫生间就被锁了,只有你出来之后别人才能用.想象一下如果卫生间的门没有锁会是什么样? 什么是加锁粒度呢?所谓加锁粒度就是你要锁住的范围是多大. 比如你在家上卫生间,你只要锁住卫生间就可以了吧,不需要将整个家都锁起来不让家人进门吧,卫生间就是你的加锁粒度. 怎样才算合

在 Windows 下用 TDM-GCC(MinGW)开发 DLL 涉及到数据同步锁及 DLL 初始化终止化函数的问题

在 Windows 下用 TDM-GCC(MinGW)开发 DLL 如果要用到数据同步锁,理论上可以采用 Windows API 提供的临界区实现(需要用到的函数有 InitializeCriticalSection.DeleteCriticalSection.EnterCriticalSection.LeaveCriticalSection),也可以采用 GCC 的 pthread 库中的 pthread mutex lock 互斥锁来实现(需要用到的函数有 pthread_mutex_ini

【转】互斥对象锁和临界区锁性能比较

原作者:chexlong 原文地址:http://blog.csdn.net/chexlong/article/details/7060425 在Win32平台上进行多线程编程,常会用到锁.下边用C++实现了互斥对象(Mutex)锁和临界区(CRITICAL_SECTION)锁,以加深理解和今后方便使用.代码已在VS2005环境下编译测试通过. Lock.h [cpp] view plaincopy #ifndef _Lock_H #define _Lock_H #include <window

一个简单的线程锁------pthread和win32的临界区(Critical Section)

临界区: 临界区是指一个小代码段,在代码能够执行前,它必须独占对某些资源的访问权.这是让若干代码能够"以原子操作方式"来使用资源的一种方法. 所谓原子(atomic)操作方式,是指这段代码知道没有别的线程要访问这个资源. 说明: 1.  MacOSX,Windows有自己的线程模型, pthread可以说是跨平台的线程编程模型解决方案,当然对pthread不熟悉的也可以使用本地线程模型, 其实pthread的win32版本也是基于本地线程模型的, pthread-win32的mutex

无锁环形队列

1 #include "stdafx.h" 2 #include <process.h> 3 #include <stdio.h> 4 #include <Windows.h> 5 #include <stdlib.h> 6 #include <assert.h> 7 8 #define MAX_VIDEO_BUFF 1024 9 10 struct Header 11 { 12 WORD wSize; 13 char dat

(一)线程的概念函数EnterCriticalSection和LeaveCriticalSection的用法

1.加入头文件#include"afxmt.h"2.定义一个全局的锁CRITICAL_SECTION的实例和一个静态变量CRITICAL_SECTION cs://可以理解为锁定一个资源static int n_AddValue = 0;定义一个全局变量用来计数(出口);3.InitializeCriticalSection(&cs);4.EnterCriticalSection(&cs);//加锁 接下来的代码处理过程中不允许其他线程进行操作,除非遇到LeaveCri