当前位置: 首页 > 编程语言 > C#

分享_10

时间:2023-04-10 16:14:26 C#

在c#中使用Mutex1个线程进入临界区,由于未知原因做了一些cw打印,我可以看到不止1个线程进入我的临界区,这是我的代码:Mutexm=new互斥锁();m.WaitOne();//这里是临界区m.ReleaseMutex();我真的很想知道我是否在这里犯了错误,在此先感谢您的帮助。编辑:我的代码包括类,所以它基本上是这样的:publicclasstest{privatemutexm;publictest(){m=newmutex();}publicfunc(){m.WaitOne();//这里是临界区m.ReleaseMutex();这里的问题是你所有的调用者都使用不同的互斥量;您需要共享锁定对象,通常是将其作为一个字段。例如,切换到更简单的锁隐喻:privatereadonlyobjectsyncLock=newobject();publicvoidThreadSafeMethod(){lock(syncLock){/*关键代码*/}}或使用互斥量:privatereadonlyMutexm=newMutex();publicvoidThreadSafeMethod(){m.WaitOne();try{/*关键代码*/}finally{m.ReleaseMutex();看起来您正在为每个线程提供自己的互斥体。那行不通的。在大多数情况下,Mutex是矫枉过正的。你只需要:privatestaticobjectsyncLock=newobject();//只有1个实例....lock(syncLock){//临界区}这种模式根本没有锁定。每个线程创建一个新的Mutex对象并立即拥有它的锁。其他线程创建并使用新的Mutex本身。考虑使用常规lock()!lock(_lockobject){//doinsidewhatneedstobedone-onlyexecutiononasinglethreadonly}where_lockobjectisasimpleprivatevariableinyourclass:privateobject_lockobject;编辑:感谢评论者!存在锁定(this)可能很危险的情况。所以我删除了它。Mutex用于标识正在运行的应用程序实例。以上就是C#学习教程:在c#中使用互斥锁分享的全部内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注——using(Mutexmutex=newMutex(true,"appname",outcreatedNew)){if(createdNew)//检查应用程序是否已经运行{KillOthers();启动应用程序();}else{MessageBox.Show("另一个实例已经运行!");}}网络收藏不代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: