草庐IT

thunder-lock

全部标签

c# - Lock vs. ToArray for thread safe foreach access of List collection

我有一个List集合,我想在多线程应用程序中对其进行迭代。我每次迭代它时都需要保护它,因为它可能会被更改,而且我不希望在执行foreach时出现“集合已修改”异常。正确的做法是什么?每次访问或循环时都使用锁。我非常害怕死锁。也许我只是对使用lock偏执,不应该。如果我走这条路以避免死锁,我需要知道什么?锁是否相当有效?每次执行foreach时,都使用List.ToArray()复制到一个数组。这会导致性能下降,但很容易做到。我担心内存抖动以及复制它的时间。只是显得过分。使用ToArray是线程安全的吗?不要使用foreach,而是使用for循环。每次执行此操作时我不需要进行长度检查以确

c# - 使用 lock(this) 说明死锁的示例代码

我读过几篇文章和帖子说lock(this),lock(typeof(MyType)),lock("astring")都是不好的做法,因为另一个线程可能锁定同一个键并导致死锁。为了理解这个问题,我试图创建一些示例代码来说明死锁,但一直无法解决这个问题。有人可以写一段简洁的代码来说明这个经典问题吗?请保持简短,我只能消化较小块的代码。编辑:我认为lassevk总结得很好;真正的问题是你失去了对锁的控制。一旦发生这种情况,您将无法控制调用锁的顺序,并且您正在允许潜在的死锁情况。lock(this)、lock(typeof(MyType))等都是您选择了无法控制的锁的情况。

c# - lock(locker) 和 lock(variable_which_I_am_using) 的区别

我正在使用C#和.NEt3.5。OptionA和OptionB有什么区别?classMyClass{privateobjectm_Locker=newobject();privateDicionarym_Hash=newDictionary();publicvoidOptionA(){lock(m_Locker){//Dosomethingwiththedictionary}}publicvoidOptionB(){lock(m_Hash){//Dosomethingwiththedictionary}}}我开始涉足线程(主要是为多线程应用程序创建缓存,不使用HttpCache类,因为

c# - Lock 语句与 Monitor.Enter 方法

我想这是一个有趣的代码示例。我们有一个类——我们称它为Test——带有一个Finalize方法。在Main方法中有两个代码块,我在其中使用了一个lock语句和一个Monitor.Enter()调用。另外,我这里有两个Test类的实例。实验非常简单:将锁定block中的Test变量置空,然后尝试使用GC.Collect方法调用手动收集它。因此,为了查看Finalize调用,我调用了GC.WaitForPendingFinalizers方法。如您所见,一切都非常简单。根据lock语句的定义,它由编译器打开到try{...}finally{..}block,在tryblock和Monitor

c# - C# 中的 lock 关键字

从MSDN上了解到lock关键字的主要作用lockStatement(C#Reference)Thelockkeywordmarksastatementblockasacriticalsectionbyobtainingthemutual-exclusionlockforagivenobject,executingastatement,andthenreleasingthelock.什么时候应该使用锁?例如,它对多线程应用程序很有意义,因为它可以保护数据。但是当应用程序不剥离任何其他线程时是否有必要?使用锁是否存在性能问题?我刚刚继承了一个到处都在使用锁的应用程序,它是单线程的,我想知

c# - 为什么 "lock (typeof (MyType))"是个问题?

MSDN对C#中的lock关键字给出了以下警告:Ingeneral,avoidlockingonapublictype,orinstancesbeyondyourcode'scontrol.Thecommonconstructslock(this),lock(typeof(MyType)),andlock("myLock")violatethisguideline:*lock(this)isaproblemiftheinstancecanbeaccessedpublicly.*lock(typeof(MyType))isaproblemifMyTypeispubliclyaccessi

c# - C#中有 "try to lock, skip if timed out"操作吗?

我需要尝试锁定一个对象,如果它已经被锁定就继续(超时后,或者没有它)。C#lock语句是阻塞的。 最佳答案 Ed为您提供了合适的功能。只是不要忘记调用Monitor.Exit()。您应该使用try-finallyblock来保证正确清理。if(Monitor.TryEnter(someObject)){try{//useobject}finally{Monitor.Exit(someObject);}} 关于c#-C#中有"trytolock,skipiftimedout"操作吗?,我们

c# - lock(new object()) -- cargo 崇拜或一些疯狂的 "language special case"?

我正在审查一位顾问编写的一些代码,虽然已经出现了数十个危险信号,但我无法理解以下代码片段:privatevoidfoo(){if(InvokeRequired){lock(newobject()){if(m_bar!=null)Invoke(newfooDelegate(foo),newobject[]{});}}else{if(OnBazChanged!=null)OnBazChanged();}}lock(newobject())在这里做什么?应该没有任何影响,因为它总是锁定另一个对象,但这种锁定在整个代码中都是持久的,即使在非复制和粘贴的部分也是如此。这是C#语言中的一些特殊情况

javascript - "locking down"JavaScript 对象有任何性能优势吗?

JavaScript1.8.5(ECMAScript5)添加了一些有趣的方法,这些方法防止将来修改传递的对象,具有不同程度的彻底性:Object.preventExtensions(obj)Object.seal(obj)Object.freeze(obj)想必这些的主要目的是捕捉错误:如果你知道你不想在某个点之后修改一个对象,你可以锁定它,这样如果你无意中尝试修改就会抛出错误稍后。(前提是你已经完成了"usestrict";。)我的问题:在V8等现代JS引擎中,使用上述方法锁定对象是否有任何性能优势(例如,更快的属性查找、减少内存占用)?(另请参阅JohnResig'sniceexp

戈朗 : panic after mutex locks have been held for too long

我试图弄清楚是什么导致我的程序挂起,我的大部分锁不应该持有超过200毫秒。(实际上要少得多!)我想创建两个新函数(Lock()和Unlock()),这样Lock就会有一个计时器,如果Lock被持有更长时间,该计时器就会panic超过200毫秒。这是我目前的尝试,但它不起作用,有什么提示吗?typeShardKVstruct{lockChanchanbool}func(kv*App)lock(reasonstring){kv.mu.Lock()f:=func(){fmt.Println("PANIC:mspassed")select{case 最佳答案