criticalsection无法定位程序输入点Make Critical Section Global于动态链接库KERNEL 32.dll上

criticalsection  时间:2021-06-08  阅读:()

interlocked和lock的区别

一、Lock定义 lock 关键字可以用来确保代码块完成运行,而不会被其他线程中断。

它可以把一段代码定义为互斥段(critical section),互斥段在一个时刻内只允许一个线程进入执行,而其他线程必须等待。

这是通过在代码块运行期间为给定对象获取互斥锁来实现的。

在多线程中,每个线程都有自己的资源,但是代码区是共享的,即每个线程都可以执行相同的函数。

这可能带来的问题就是几个线程同时执行一个函数,导致数据的混乱,产生不可预料的结果,因此我们必须避免这种情况的发生。

而在.NET中最好了解一下进程、应用域和线程的概念,因为Lock是针对线程一级的,而在.NET中应用域是否会对Lock起隔离作用,我的猜想是,即不在同一应用域中的线程无法通过Lock来中断;另外也最好能了解一下数据段、代码段、堆、栈等概念。

在C# lock关键字定义如下: lock(expression) statement_block,其中expression代表你希望跟踪的对象,通常是对象引用。

如果你想保护一个类的实例,一般地,你可以使用this;如果你想保护一个静态变量(如互斥代码段在一个静态方法内部),一般使用类名就可以了。

而statement_block就是互斥段的代码,这段代码在一个时刻内只可能被一个线程执行。

二、简单解释一下执行过程 先来看看执行过程,代码示例如下: private static object ojb = new object(); lock(obj) { //锁定运行的代码段 } 假设线程A先执行,线程B稍微慢一点。

线程A执行到lock语句,判断obj是否已申请了互斥锁,判断依据是逐个与已存在的锁进行object.ReferenceEquals比较(此处未加证实),如果不存在,则申请一个新的互斥锁,这时线程A进入lock里面了。

这时假设线程B启动了,而线程A还未执行完lock里面的代码。

线程B执行到lock语句,检查到obj已经申请了互斥锁,于是等待;直到线程A执行完毕,释放互斥锁,线程B才能申请新的互斥锁并执行lock里面的代码。

三、Lock的对象选择问题 接下来说一些lock应该锁定什么对象。

1、为什么不能lock值类型 比如lock(1)呢?lock本质上Monitor.Enter,Monitor.Enter会使值类型装箱,每次lock的是装箱后的对象。

lock其实是类似编译器的语法糖,因此编译器直接限制住不能lock值类型。

退一万步说,就算能编译器允许你lock(1),但是object.ReferenceEquals(1,1)始终返回false(因为每次装箱后都是不同对象),也就是说每次都会判断成未申请互斥锁,这样在同一时间,别的线程照样能够访问里面的代码,达不到同步的效果。

同理lock((object)1)也不行。

2、Lock字符串 那么lock("xxx")字符串呢?MSDN上的原话是: 锁定字符串尤其危险,因为字符串被公共语言运行库 (CLR)“暂留”。

这意味着整个程序中任何给定字符串都只有一个实例,就是这同一个对象表示了所有运行的应用程序域的所有线程中的该文本。

因此,只要在应用程序进程中的任何位置处具有相同内容的字符串上放置了锁,就将锁定应用程序中该字符串的所有实例。

3、MSDN推荐的Lock对象 通常,最好避免锁定 public 类型或锁定不受应用程序控制的对象实例。

例如,如果该实例可以被公开访问,则 lock(this) 可能会有问题,因为不受控制的代码也可能会锁定该对象。

这可能导致死锁,即两个或更多个线程等待释放同一对象。

出于同样的原因,锁定公共数据类型(相比于对象)也可能导致问题。

而且lock(this)只对当前对象有效,如果多个对象之间就达不到同步的效果。

而自定义类推荐用私有的只读静态对象,比如: private static readonly object obj = new object(); 为什么要设置成只读的呢?这时因为如果在lock代码段中改变obj的值,其它线程就畅通无阻了,因为互斥锁的对象变了,object.ReferenceEquals必然返回false。

4、lock(typeof(Class)) 与锁定字符串一样,范围太广了。

五、特殊问题:Lock(this)等的详细解释 在以前编程中遇到lock问题总是使用lock(this)一锁了之,出问题后翻看MSDN突然发现下面几行字:通常,应避免锁定 public 类型,否则实例将超出代码的控制范围。

常见的结构 lock (this)、lock (typeof (MyType)) 和 lock ("myLock") 违反此准则:如果实例可以被公共访问,将出现C# lock this问题。

如果 MyType 可以被公共访问,将出现 lock (typeof (MyType)) 问题。

由于进程中使用同一字符串的任何其他代码将共享同一个锁,所以出现 lock(“myLock”) 问题。

来看看C# lock this问题:如果有一个类Class1,该类有一个方法用lock(this)来实现互斥: publicvoidMethod2() { lock(this) { System.Windows.Forms.MessageBox.Show("Method2End"); } } 如果在同一个Class1的实例中,该Method2能够互斥的执行。

但是如果是2个Class1的实例分别来执行Method2,是没有互斥效果的。

因为这里的lock,只是对当前的实例对象进行了加锁。

Lock(typeof(MyType))锁定住的对象范围更为广泛,由于一个类的所有实例都只有一个类型对象(该对象是typeof的返回结果),锁定它,就锁定了该对象的所有实例,微软现在建议,不要使用lock(typeof(MyType)),因为锁定类型对象是个很缓慢的过程,并且类中的其他线程、甚至在同一个应用程序域中运行的其他程序都可以访问该类型对象,因此,它们就有可能代替您锁定类型对象,完全阻止您的执行,从而导致你自己的代码的挂起。

锁住一个字符串更为神奇,只要字符串内容相同,就能引起程序挂起。

原因是在.NET中,字符串会被暂时存放,如果两个变量的字符串内容相同的话,.NET会把暂存的字符串对象分配给该变量。

所以如果有两个地方都在使用lock(“my lock”)的话,它们实际锁住的是同一个对象。

到此,微软给出了个lock的建议用法:锁定一个私有的static 成员变量。

.NET在一些集合类中(比如ArrayList,HashTable,Queue,Stack)已经提供了一个供lock使用的对象SyncRoot,用Reflector工具查看了SyncRoot属性的代码,在Array中,该属性只有一句话:return this,这样和lock array的当前实例是一样的。

ArrayList中的SyncRoot有所不同 get { if(this._syncRoot==null) { Interlocked.CompareExchange(refthis._syncRoot,newobject(),null); } returnthis._syncRoot; 其中Interlocked类是专门为多个线程共享的变量提供原子操作(如果你想锁定的对象是基本数据类型,那么请使用这个类),CompareExchange方法将当前syncRoot和null做比较,如果相等,就替换成new object(),这样做是为了保证多个线程在使用syncRoot时是线程安全的。

集合类中还有一个方法是和同步相关的:Synchronized,该方法返回一个对应的集合类的wrapper类,该类是线程安全的,因为他的大部分方法都用lock来进行了同步处理,比如Add方法: publicoverridevoidAdd(objectkey,alue) { lock(this._table.SyncRoot) { this._table.Add(key,value); } } 这里要特别注意的是MSDN提到:从头到尾对一个集合进行枚举本质上并不是一个线程安全的过程。

即使一个集合已进行同步,其他线程仍可以修改该集合,这将导致枚举数引发异常。

若要在枚举过程中保证线程安全,可以在整个枚举过程中锁定集合: QueuemyCollection=newQueue(); lock(myCollection.SyncRoot){ foreach(ObjectiteminmyCollection){ //Insertyourcodehere. } } 最后 注意:应避免锁定 public 类型,否则实例将超出代码的控制范围。

常见的结构 lock (this)、lock (typeof (MyType)) 和 lock ("myLock") 违反此准则: 1)如果实例可以被公共访问,将出现 lock (this) 问题; 2)如果 MyType 可以被公共访问,将出现 lock (typeof (MyType)) 问题; 3)由于进程中使用同一字符串的任何其他代码将共享同一个锁,所以出现 lock("myLock") 问题; 最佳做法是定义 private 对象来锁定, 或 private static 对象变量来保护所有实例所共有的数据。

求教一单片机内运行的c语句意思。

感觉应该是个临界区对象,用来控制访问冲突的。

就是说,一旦进入临界区 HAL_ENTER_CRITICAL_SECTION,intState会被赋个特殊的值,在退出临界 HAL_EXIT_CRITICAL_SECTION 时,intState被复位。

如果在执行 HAL_ENTER_CRITICAL_SECTION 时,intState已经被置位,说明已经有其他人占用了临界区,则 这句进入的语句会导致挂起,直到其他人离开临界区

CriticalSection这样用哪里错了?

static CRITICAL_SECTION lps; 是静态变量,只需要初始化一次; 不能放在sample 的构造函数里面初始化。

你定义一个静态函数来初始化它,然后一个静态函数来删除它。

在数据库中什么叫数据卸出?

访问临界区完毕后,使用CCriticalSection的成员函数Unlock()来释放临界区: critical_section.Unlock(); 再通俗一点讲,就是线程A执行到critical_section.Lock();语句时,如果其它线程(B)正在执行critical_section.Lock();语句后且critical_section. Unlock();语句前的语句时,线程A就会等待,直到线程B执行完critical_section. Unlock();语句,线程A才会继续执行。

无法定位程序输入点Make Critical Section Global于动态链接库KERNEL 32.dll上

(几秒钟解决)金山卫士系统文件修复工具解决“kernel32.dll、Dsound.dll、Ddraw.dll、D3d8.dll 文件找不到”等问题。

绿色工具下载地址: 免费 /thread-1694-1-1.html

可修复系统文件列表: Dsound.dll,Ddraw.dll,D3d8.dll,rpcss.dll,olepro32.dll,d3d8thk.dll,

dlg32.dll,d3d9.dll,lpk.dll,kernel32.dll,ksuser.dll,

urlmon.dll,npptools.dll,res.dll,imm32.dll,usp10.dll

TTcloud(月$70)E3-1270V3 8GB内存 10Mbps带宽 ,日本独立服务器

关于TTCLOUD服务商在今年初的时候有介绍过一次,而且对于他们家的美国圣何塞服务器有过简单的测评,这个服务商主要是提供独立服务器业务的。目前托管硬件已经达到5000台服务器或节点,主要经营圣何塞,洛杉矶以及日本东京三个地区的数据中心业务。这次看到商家有推出了新上架的日本独立服务器促销活动,价格 $70/月起,季付送10Mbps带宽。也可以跟进客户的需求进行各种DIY定制。内存CPU硬盘流量带宽价...

VoLLcloud:超便宜香港CMI大带宽vps-三网CMI直连-年付四免服务-低至4刀/月-奈飞

vollcloud LLC创立于2020年,是一家以互联网基础业务服务为主的 技术型企业,运营全球数据中心业务。致力于全球服务器租用、托管及云计算、DDOS安 全防护、数据实时存储、 高防服务器加速、域名、智能高防服务器、网络安全服务解决方案等领域的智 能化、规范化的体验服务。所有购买年付产品免费更换香港原生IP(支持解锁奈飞),商家承诺,支持3天内无条件退款(原路退回)!点击进入:vollclo...

老薛主机入门建站月付34/月,年付345元,半价香港VPS主机

老薛主机怎么样?老薛主机这个商家有存在有一些年头。如果没有记错的话,早年老薛主机是做虚拟主机业务的,还算不错在异常激烈的市场中生存到现在,应该算是在众多商家中早期积累到一定的用户群的,主打小众个人网站业务所以能持续到现在。这不,站长看到商家有在进行夏季促销,比如我们很多网友可能有需要的香港vps主机季度及以上可以半价优惠,如果有在选择不同主机商的香港机房的可以看看老薛主机商家的香港vps。点击进入...

criticalsection为你推荐
excel计算公式excel表格如何用公式计算加减乘除混合运算Honeypotfeedback 歌词翻译chrome系统Chrome系统怎么进biosorphanremoval大家知道orphan这个单词除了孤儿还有什么意思吗?oa办公系统下载完全免费的oa办公系统模式识别算法模式识别的简史河北云办税厅河北省商务厅的人员编制移动硬盘文件或目录损坏且无法读取移动硬盘提示文件或目录损坏且无法读取,怎么修复微信网页版怎么看朋友圈电脑版微信怎么看朋友圈和发朋友圈什么是网络地址手机IP地址是什么?
网通服务器租用 stablehost 搬瓦工官网 omnis la域名 paypal认证 免费ftp空间 免费smtp服务器 韩国网名大全 本网站在美国维护 asp免费空间申请 129邮箱 无限流量 免费外链相册 网购分享 vul 国外在线代理服务器 永久免费空间 atom处理器 97rb 更多