Tag: 锁定

基于ID字段的并发对象锁

我有一个生产者/消费者流程。 消费对象具有ID属性(类型为整数),我想一次只消耗一个具有相同ID的对象。 我怎么能这样做? 也许我可以做这样的事情,但我不喜欢它(创造了太多的对象,而每天只能使用一个或两个具有相同ID的对象并且锁定(_lockers)有点耗费时间: private readonly Dictionary _lockers = new Dictionary(); private object GetLocker(int id) { lock(_lockers) { if(!_lockers.ContainsKey(id)) _lockers.Add(id,new object()); return _lockers[id]; } } private void Consume(T notif) { lock(GetLocker(notif.ID)) { … } } enter code here 注意:同样的问题,ID属性是string类型(在cas中,我可以锁定string.Internal(currentObject.ID)

c#Thread Safe Deep Copy

我一直在阅读很多其他问题以及很多谷歌搜索,我一直无法找到一个明确的解决方案。 基于我读过的一些最佳实践,类的静态方法应该是线程安全的,实例成员应该为消费者提供线程安全性。 我想为这个类实现一个深层复制方法。 该类本身具有其他引用类型成员。 有没有办法使深度复制方法线程安全,而不必将开销强加给类的所有实例成员?

C#lock(mylocker)不起作用

我有很多web服务调用(asychronous),在回调中,我将结果绘制到Excel。 我想同步绘图方法。 所以我使用以下内容,但是,从我在Visual Studio中跟踪,每次锁定(locker)成功,并且有许multithreading运行clearcommentIfany,plot。 我无法弄清楚为什么这不能按预期工作! 谢谢 private readonly object locker = new object(); void ProcessPlot() { lock (locker) { Debug.WriteLine(“currentThreadID: ” + Thread.CurrentThread.ManagedThreadId); //Helper.Dispatcher.Invoke(new AddClearCommentDelegate(ClearCommentIfAny)); ClearCommentIfAny(); if (Response.status != Status.COMPLETE) { ErrorMessage = ManipulateStatusMsg(Response); //Helper.Dispatcher.Invoke(new AddClearCommentDelegate(AddCommentToCell)); AddCommentToCell(); } else // COMPLETE { // TODO: Convert this into factory pattern Debug.WriteLine(“ReportBuilder.Dispatcher’s address ” + Helper.GetAddress(Helper.Dispatcher)); //Helper.Dispatcher.Invoke(new […]

为什么在从字典中读取时会锁定

我对正在阅读的书中的代码列表,Nutshell中的C#3以及线程感到困惑。 在关于应用程序服务器中的线程安全的主题中,下面的代码是作为UserCache的示例给出的: static class UserCache { static Dictionary _users = new Dictionary(); internal static User GetUser(int id) { User u = null; lock (_users) // Why lock this??? if (_users.TryGetValue(id, out u)) return u; u = RetrieveUser(id); //Method to retrieve from databse lock (_users) _users[id] = u; //Why lock this??? return u; } } 作者解释了为什么RetrieveUser方法没有锁定,这是为了避免长时间锁定缓存。 […]

如何在C#中使用多个变量来锁定范围

我有一种情况,即只有两个更衣室对象空闲时才应执行代码块。 我希望有类似的东西: lock(a,b) { // this scope is in critical region } 然而,似乎没有那样的东西。 这是否意味着这样做的唯一方法是: lock(a) { lock(b) { // this scope is in critical region } } 这甚至可以按预期工作吗? 虽然代码编译,但我不确定它是否会实现我所期望的。

如何通过方法参数锁定?

string Get(string key){ lock(_sync){ // DoSomething } } 如果DoSomething仅依赖于密钥,我想要密钥依赖锁。 我认为它可能是带有同步对象的字典。 有没有完整的解决方案? 像真实例子一样在asp.net中锁定缓存的最佳方法是什么?

何时使用锁定指南

我想知道开发人员应该遵循何时(以及何处)放置锁的指导方针。 例如:我理解应锁定此类代码,以避免另一个线程意外更改SomeHeapValue值的可能性。 class Foo { public SomeHeapObject myObject; public void DoSummat(object inputValue_) { myObject.SomeHeapValue = inputValue_; } } 然而,我的问题是,锁定有多深? 例如,如果我们有这个代码: class Foo { public SomeHeapObject myObject; public void DoSummat(object inputValue_) { myObject.SomeHeapValue = GetSomeHeapValue(); } } 我们应该锁定DoSummat(…)方法,还是应该锁定GetSomeHeapValue()方法? 在编写multithreading代码时,是否有任何指导方针都要记住?

C#:从锁定块调用事件

我经常听说在调用事件监听器之前解锁所有锁是个好主意,以避免死锁。 但是,由于lock {}块可以由C#中的同一个线程重入,是否可以从锁定块调用事件,或者我是否需要复制相关状态数据并在锁定块外调用事件? 如果没有,请举例说明从lock {}块中调用事件是否有问题。 谢谢

写一个锁是否保证在另一个线程中读取新内容? (.Net,内存模型)

假设我有一个属性,其setter受锁保护,但没有任何锁定在getter周围,例如 private long _myField; public long MyProperty { get { return _myField; } set { lock(whatever) _myField = value; } } 除了同步写入(但不是读取)之外,锁定或者说Monitor.Exit应该导致易失性写入 。 我们现在说我们有两个线程A和B,并且发生以下序列: A读取MyProperty的当前值。 B将新值写入MyProperty 。 A再次读取MyProperty的当前值。 问:A现在可以保证看到新值吗? 或者我们的锁只是确保B及时写入主内存,而不是其他线程读取新值? 或者答案可能取决于我们是在运行.Net 2+还是“弱”的ECMA实施?

可升级的readlock的优势?

我想知道使用可升级读锁的优点是什么,而不是执行以下步骤: 读取锁定 检查条件,看看我们是否需要写锁定 释放读锁定 采取写锁定 执行更新 释放写锁定 与采用可升级的读锁相反,执行上述步骤的一个明显缺点是,在步骤3和4之间存在时间窗口,其中另一个线程可以占用写锁定。 除了这个优势之外,您还发现了其他优势,可以通过我上面提到的步骤获得可升级的读锁定function吗?