Tag: 锁定

线程同步。 为什么这个锁不足以同步线程

可能重复: 线程同步。 完全锁定如何使内存访问“正确”? 这个问题的灵感来自于这个问题。 我们有一个以下的测试课程 class Test { private static object ms_Lock=new object(); private static int ms_Sum = 0; public static void Main () { Parallel.Invoke(HalfJob, HalfJob); Console.WriteLine(ms_Sum); Console.ReadLine(); } private static void HalfJob() { for (int i = 0; i < 50000000; i++) { lock(ms_Lock) { }// empty lock ms_Sum += 1; } } […]

锁定字段或局部变量?

在我从Marc 的回答中读到这个问题之后…. 我有时看到人们锁定局部变量。 这段代码坏了吗? public void Do() { object o = new Object(); lock (o) { … } } 我相信object o = new Object(); 应该在方法之外作为Field 。 由于每个线程都获得了一个新的o实例,因此会有多个锁。 我在这里想念的是什么? 在这种特定情况下,它不应该锁定字段吗?

线程安全使用锁定助手(关于内存障碍)

通过锁定助手,我指的是一次性对象,通过using语句可以实现锁定。 例如,考虑Jon Skeet的MiscUtil中 SyncLock类的典型用法: public class Example { private readonly SyncLock _padlock; public Example() { _padlock = new SyncLock(); } public void ConcurrentMethod() { using (_padlock.Lock()) { // Now own the padlock – do concurrent stuff } } } 现在,请考虑以下用法: var example = new Example(); new Thread(example.ConcurrentMethod).Start(); 我的问题是这个 – 因为example是在一个线程上创建的,而ConcurrentMethod是在另一个线程上调用的,所以ConcurrentMethod的线程无法忽略_padock在构造函数中的赋值(由于线程缓存/读写重新排序),因此抛出NullReferenceException (在_padLock本身)? 我知道使用Monitor / lock会带来内存障碍,但是当使用这些锁定助手时,我无法理解为什么会有这样的障碍。 在这种情况下,据我所知,构造函数必须被修改: […]

锁定超时模式

lock使用这种模式 if(Monitor.Enter(lock)) try { … } finally { Monitor.Exit(lock); } // using this style to reduce post “height” 如果我们不想等待无限,我们可以提供超时 if(!Monitor.TryEnter(lock, timeout)) throw new TimeoutException(); try { … } finally { Monitor.Exit(lock); } 我有方法,方法必须在开始做任何事情之前获得多个锁。 这看起来很糟糕: if(!Monitor.TryEnter(lockA, timeout)) throw new TimeoutException(); try { if(!Monitor.TryEnter(lockB, timeout)) throw new TimeoutException(); try { if(!Monitor.TryEnter(lockC, timeout)) throw new TimeoutException(); try { […]

C#线程/锁定混乱

我有以下代码: var items = new List {“1”, “2”, “3”}; // 200 items foreach(var item in items) { ThreadPool.QueueUserWorkItem((DoWork), item); } private void DoWork(object obj) { lock(this) { using(var sw = File.AppendText(@”C:\somepath.txt”) { sw.WriteLine(obj); } } } 由于线程,出于某种原因,我得到了写入文件的200个项目的随机数。 60或127或有时只有3.如果我删除ThreadPool并只在原始foreach循环内写入,则所有200个项目都会成功写入。 不知道为什么会这样? 谢谢你的帮助。

如何正确锁定值类型?

我正在阅读有关线程和锁定的内容。 通常的做法是你不能(不应该)锁定值类型。 所以问题是,锁定值类型的推荐方法是什么? 我知道有几种方法可以做一件事,但我还没有看到一个例子。 虽然在MSDN论坛上有一个很好的主题,但我现在似乎无法找到它。 谢谢

等待文件锁释放的正确模式是什么?

我需要打开一个文件,但如果它目前不可用,我需要等到它准备好了。 什么是最好的方法? 情景 我正在使用文件作为应用程序数据的持久缓存机制。 这些数据需要经常读取和反序列化(只写一次,偶尔删除)。 我有一个清理过程,它运行在一个单独的线程上,确定不再需要哪些文件并删除它们。 打开和读取文件可能同时发生(很少,但可能发生),我希望进程等待并尝试再次读取数据。 谢谢!

锁定和管理锁定exception的解决方案有什么问题?

我的目标是在我的应用程序中使用线程安全function和exception处理的约定。 我对线程管理/multithreading的概念比较陌生。 我使用的是.NET 3.5 在阅读本文http://blogs.msdn.com/b/ericlippert/archive/2009/03/06/locks-and-exceptions-do-not-mix后,我编写了以下帮助方法来包装所有锁定的操作。 aspx ,它是针对这个问题而链接的, Monitor vs lock 。 我的想法是,如果我在我的应用程序中一致地使用此约定,那么编写线程安全代码并在线程安全代码中处理错误将更容易,而不会破坏状态。 public static class Locking { private static readonly Dictionary CorruptionStateDictionary = new Dictionary(); private static readonly object CorruptionLock = new object(); public static bool TryLockedAction(object lockObject, Action action, out Exception exception) { if (IsCorrupt(lockObject)) { exception = new LockingException(“Cannot execute locked action on […]

.NET线程 – 分配需要锁定

我有一些multithreading代码,我想增加一点的性能,所以我想知道我是否可以摆脱锁。 我有一个现场成员: private IList status; 它在这样的线程中更新: status = GetUpdatedStatus(); 它在另一个线程中使用,如下所示: var currentStatus = status; 所以问题是,如果没有锁定两个赋值语句,上面会产生任何问题吗? 我想我能看到的唯一情况是currentStatus为null,但是我再次希望赋值有点线程安全(或者它已经更改了引用)

multithreading谜语更好的解决方案?

这是任务:我需要根据文件名锁定。 最多可以有一百万个不同的文件名。 (这用于大规模基于磁盘的缓存)。 我希望内存使用率低,查找时间短,这意味着我需要一个GC锁定字典。 (dict中只能存在使用中的锁)。 回调操作可能需要几分钟才能完成,因此全局锁定是不可接受的。 高吞吐量至关重要。 我已经在下面发布了我当前的解决方案,但我对复杂性感到不满意。 编辑:请不要发布不是100%正确的解决方案。 例如,允许在“获取锁定对象”阶段和“锁定”阶段之间从字典中删除锁定的解决方案是不正确的,无论它是否是“已接受”的设计模式。 有比这更优雅的解决方案吗? 谢谢! [编辑:我根据RobV的建议更新了我的代码以使用循环与递归] [编辑:再次更新代码以允许’超时’和更简单的调用模式。 这可能是我使用的最终代码。 仍然与原始post中的基本算法相同。] [编辑:再次更新代码以处理回调内部的exception,而无需孤立锁定对象] public delegate void LockCallback(); /// /// Provides locking based on a string key. /// Locks are local to the LockProvider instance. /// The class handles disposing of unused locks. Generally used for /// coordinating writes to files (of […]