Tag: 锁定

Monitor.TryEnter / Monitor.Exit和SynchronizationLockException

是否有可能检测到同一个线程是否试图释放锁定? 我们在代码中有很多地方看起来像: try { try { if(!Monitor.TryEnter(obj, 2000)) { throw new Exception(“can not lock”); } } finally { Monitor.Exit(obj); } } catch { //Log } 上面的代码非常简化,实际上Enter和Exit语句位于自定义对象(lock manager)中。 问题是,在该结构中,我们在尝试“退出”时有SynchronizationLockException ,因为它看起来像是没有成功锁定的线程,试图最终释放。 所以问题是,我怎么知道创建Monitor.Exit的线程是否与Monitor.Enter的线程相同? 我以为我可以使用CurrentThread.Id同步进入和退出,但我不确定它是否“足够安全”。

为什么这段代码不会以死锁结束

我有这个C#代码: public class Locking { private int Value1; private int Value2; private object lockValue = new Object(); public int GetInt1(int value1, int value2) { lock (lockValue) { Value1 = value1; Value2 = value2; return GetResult(); } } public int GetInt2(int value1, int value2) { lock (lockValue) { return GetInt1(value1, value2); } } private int GetResult() […]

C#锁定在锁定块中重新分配的对象

我在一个类中有这个代码: private static MyObject _locker = new MyObject(); … lock (_locker) { … _locker = new MyObject(); … } 它会锁定_locker吗?

使用MEF进行线程安全延迟实例化

// Member Variable private static readonly object _syncLock = new object(); // Now inside a static method foreach (var lazyObject in plugins) { if ((string)lazyObject.Metadata[“key”] = “something”) { lock (_syncLock) { // It seems the `IsValueCreated` is not up-to-date if (!lazyObject.IsValueCreated) lazyObject.value.DoSomething(); } return lazyObject.value; } } 在这里,我需要每个循环同步访问。 有很multithreading迭代这个循环,并根据它们正在寻找的key ,创建并返回一个惰性实例。 lazyObject应该lazyObject创建lazyObject 。 虽然Lazy类是这样做的,尽管使用了锁,但在高线程下我创建了多个实例(我在一个volatile static int上使用Interlocked.Increment跟踪它并将其记录到某处)。 […]

在multithreading程序中使用EF的好建议?

您是否有一些好的建议在multithreading程序中使用EF? 我有2层: 一个EF层来读/写我的数据库 一个multithreading服务,它使用我的实体(读/写)并进行一些计算(我在框架中使用任务并行库) 如何在每个线程中同步我的对象上下文? 你知道一个好的模式让它发挥作用吗?

在.net中的lock语句中调用Thread.Sleep()

我想知道在一个已经获得监视器的线程上调用Threa.Sleep是否会在进入睡眠状态之前释放锁定: object o = new object(); Montior.Enter(o); Thread.Sleep(1000); Monitor.Exit(o); 线程被挂起 – 其他线程可以获得吗?

围绕多个语句的锁定语句是否确保所有更改对其他线程可见(假设它们进入相同的互斥锁)?

如果在一个锁定代码块中有多个共享变量赋值,它是否一定意味着所有这些更改对其他线程立即可见,一旦在同一对象上输入锁定语句就可能在其他处理器上运行 – 或者没有这样的保证? 很多例子都显示了一个常见变量的“set”或“get”,并详细介绍了内存障碍,但如果内部有更复杂的语句,会发生什么? 有可能甚至函数调用做其他事情? 像这样的东西: lock(sharedObject) { x = 10; y = 20; z = a + 10; } 如果此代码在另一个可能在另一个处理器上执行的线程上运行,它是否会对更改的“可见性”做出任何保证? lock (sharedObject) { if (y == 10) { // Do something. } } 如果答案是否定的 – 也许并解释这些变化何时可见?

这个锁用法线程安全吗?

我知道使用lock(this)或任何共享对象是错误的。 我想知道这种用法是否合适? public class A { private readonly object locker = new object(); private List myList; public A() { myList = new List() } private void MethodeA() { lock(locker) { myList.Add(10); } } public void MethodeB() { CallToMethodInOtherClass(myList); } } public class OtherClass { private readonly object locker = new object(); public CallToMethodInOtherClass(List list) { […]

锁定一个对象

我经常看到这里显示的代码,即分配对象的位置,然后用作“锁定对象”。 在我看来,你可以使用任何对象,包括事件本身作为锁对象。 为什么要分配一个什么都不做的新对象? 我的理解是,在对象上调用lock()实际上不会改变对象本身,也不会实际锁定它被使用,它只是用作多个锁定语句锚定的占位符。 public class Shape : IDrawingObject, IShape { // Create an event for each interface event event EventHandler PreDrawEvent; event EventHandler PostDrawEvent; object objectLock = new Object(); // Explicit interface implementation required. // Associate IDrawingObject’s event with // PreDrawEvent event EventHandler IDrawingObject.OnDraw { add { lock (objectLock) { PreDrawEvent += value; } […]

使用C#lock关键字

我发布了对C#lock的理解如下,请帮我validation是否正确。 public class TestLock { private object threadLock = new object(); … public void PrintOne() { lock (threadLock) { // SectionOne } } public void PrintTwo() { lock (threadLock) { // SectionTwo } } … } 情况I> Thread1和Thread2同时尝试调用PrintOne。 由于PrintOne受到实例锁的保护,因此任何时候只有一个线程可以独占进入SectionOne。 它是否正确? 案例II> Thread1和Thread2同时分别尝试调用PrintOne和PrintTwo(即Thread1调用PrintOne和Thread2调用PrintTwo)由于两个打印方法都被同一个实例锁保护,因此任何时候只有一个线程可以独占访问SectionOne或SectionTwo ,但不是两个。 它是否正确?