Tag: 锁定

静态锁是否适用于不同的子类?

如果我有 abstract class Parent { static object staticLock = new object(); public void Method1() { lock(staticLock) { Method2(); } } protected abstract Method2(); } class Child1 : Parent { protected override Method2() { // Do something … } } class Child2 : Parent { protected override Method2() { // Do something else … } } […]

在什么条件下线程可以同时进入锁(监控)区域多次?

(问题修改):到目前为止,答案都包括一个线程重新进入锁定区域的线程,通过递归之类的东西,您可以在其中跟踪单个线程进入锁定两次的步骤。 但是有可能以某种方式,对于单个线程(可能来自ThreadPool,可能是由于定时器事件或异步事件或线程进入hibernate状态并在其他一些代码块中被唤醒/重用)以某种方式产生两个不同的地方彼此独立,因此,当开发人员通过简单地阅读他们自己的代码而没有想到它时,会遇到锁重入问题? 在ThreadPool类备注( 单击此处 )中,备注似乎表明睡眠线程应在不使用时重复使用,否则会因睡眠而浪费。 但是在Monitor.Enter参考页面上( 点击这里 ),他们会说“同一个线程在没有阻止的情况下不止一次调用Enter是合法的”。 所以我认为必须有一些我应该小心避免的东西。 它是什么? 如何让单个线程两次进入同一个锁定区域? 假设您有一些锁定区域,不幸的是很长时间。 这可能是现实的,例如,如果您访问已被分页的内存(或其他内容)。锁定区域中的线程可能会进入睡眠状态。 同一个线程是否有资格运行更多代码,这可能会意外地进入同一个锁定区域? 在我的测试中,以下内容不会使同一个线程的多个实例进入同一个锁定区域。 那么如何产生问题呢? 你究竟需要小心避免什么? class myClass { private object myLockObject; public myClass() { this.myLockObject = new object(); int[] myIntArray = new int[100]; // Just create a bunch of things so I may easily launch a bunch of Parallel things Array.Clear(myIntArray, 0, myIntArray.Length); […]

强制关闭C#打开的文件

我在这里发现了一个类似的问题,但它已被关闭/接受并回答“不要那样做”。 我处在这样一种情况,我不关心其他应用程序发生了什么,我想要一个可能被其他人锁定的文件(如果需要可以粗鲁地),并且我可以使用它。 我可能需要移动,重命名或删除此文件。 基本上我需要处理由不清理它的锁的应用程序创建的目录中的文件。 我知道应用程序在我的调用时已完成处理,但我需要在运行时终止锁定。 此外,我似乎与扫描服务器所在远程共享的本地AV软件的读取冲突。 所有这些加起来是一个无法解决的“强制关闭”的情况,所以我可以做我需要的。 有谁知道该怎么办?

在线程之间锁定图像的麻烦

我需要在两个不同的线程中获取一个锁,以便访问EmguCv中的Bitmap(从网络摄像头填充)。 我有一个“GetFrame”函数查询相机并将它返回到.NET位图。 我有两个线程需要访问这个Bitmap,一个需要写入Bitmap并将Bitmap分配给一个图片框,另一个需要读取Bitmap,将其转换为Image对象并将其分配给EMGU ImageBox。 我首先锁定一个任意对象,然后我做我的操作。 代码如下(_Camera.LiveFrame是Bitmap): 写作/阅读线程: while (_CaptureThreadRunning) { lock (_Camera) { // _Camera.GetFrame writes to the Bitmap if (_VideoPlaying && _Camera.GetFrame(500)) pbLiveFeed.Invalidate(); } } _Camera.CloseCamera(true); _CaptureExitEvent.Set(); // Set to signal captureThread has finished 阅读/ ImageBox线程: while (_ProcessThreadRunning) { lock (_Camera) { // _Camera.LiveFrame is the Bitmap procImage = new Image((Bitmap)_Camera.LiveFrame.Clone()); procImage.Draw(new Rectangle(10,20,20,15),new Bgr(Color.LightGreen), […]

锁定一个实习的字符串?

更新:如果此方法不是线程安全的,这是可以接受的,但我有兴趣学习如何使其线程安全。 另外,如果可以避免,我不想为所有key锁定单个对象。 原始问题:假设我想编写一个更高阶的函数,它接受一个键和一个函数,并检查一个对象是否已使用给定的密钥进行缓存。 如果是,则返回缓存的值。 否则,运行给定的函数并缓存并返回结果。 这是我的代码的简化版本: public static T CheckCache(string key, Func fn, DateTime expires) { object cache = HttpContext.Current.Cache.Get(key); //clearly not thread safe, two threads could both evaluate the below condition as true //what can I lock on since the value of “key” may not be known at compile time? if (cache == null) […]

我可以在锁内放一个return语句

Dupe: 在锁定程序中返回声明:内部或外部 标题有点误导。 我知道你可以做到,但我想知道性能影响。 考虑这两个代码块。 (没有error handling) 该块具有锁定之外的return public DownloadFile Dequeue() { DownloadFile toReturn = null; lock (QueueModifierLockObject) { toReturn = queue[0]; queue.RemoveAt(0); } return toReturn; } 该块在锁中具有return语句 public DownloadFile Dequeue() { lock (QueueModifierLockObject) { DownloadFile toReturn = queue[0]; queue.RemoveAt(0); return toReturn; } } 代码有什么不同吗? 我理解性能差异(如果有的话)是最小的,但我特别想知道lock释放的顺序是否会有所不同。

限制一次执行方法的线程数

我们希望限制应用程序可以对其应用程序服务器进行的并行请求的数量。 我们有可能运行100多个后台线程,它们希望在某些时候调用应用程序服务器,但只希望5个线程能够在任何时候调用SendMessage()(或任何方法)。 实现这一目标的最佳方法是什么? 我曾考虑使用某种类型的网守对象来阻止进入该方法的线程,直到在其中执行的线程数已经降到阈值以下。 这是一个合理的解决方案还是我忽略了这可能是脏/危险的事实? 我们正在使用C#.NET 3.5进行开发。 谢谢, 史蒂夫

如何在C#.NET中跨线程锁定控制台?

我有一个记录器类,处理各种颜色的信息显示(yay。)。 但是,因为它以分开的步骤写入控制台( 即将颜色设置为红色,写入文本,将颜色设置为灰色,写入文本,以便呈现“[错误]描述…”,错误为红色 ) ,但我有一个multithreading应用程序,所以步骤可以混淆和随机颜色打印随机的东西。 我知道lock关键字,但它不适用于静态类,如控制台。 如果我不清楚,这是一些示例代码: using System; using System.Text; namespace N.Utilities.IO { public static class Logger { private static void WriteColored(string value, ConsoleColor color) { if (Logger.UseColor) { Console.ForegroundColor = color; Console.Write(value); Console.ForegroundColor = ConsoleColor.Gray; } else { Console.Write(value); } } private static void WriteLineColored(string value, ConsoleColor color) { if (Logger.UseColor) { Console.ForegroundColor […]

ToArray()可以抛出exception吗?

虽然这个问题的答案非常好,但它意味着你应该锁定对List.ToArray()的锁定以实现并发。 这篇博文还暗示它可能会灾难性地失败(但很少)。 在枚举列表或其他集合时,我通常使用ToArray而不是锁定,以避免“集合已修改,枚举可能无法完成”exception。 这个答案和博客文章都对这个假设提出质疑。 List.ToArray()的文档没有列出任何exception,所以我一直认为它总是会完成(虽然可能是陈旧的数据),虽然从数据一致性的角度来看它不是线程安全的,但它是线程从代码执行的角度来看是安全的 – 换句话说,它不会抛出exception并且调用它不会破坏底层集合的内部数据结构。 如果这个假设不正确,那么虽然它从未引起过问题,但它可能是高可用性应用程序中的定时炸弹。 什么是明确的答案?

正确锁定ASP.NET

我有一个搜索function相当慢的ASP.NET站点,我想通过使用查询作为缓存键将结果添加到缓存一小时来提高性能: using System; using System.Web; using System.Web.Caching; public class Search { private static object _cacheLock = new object(); public static string DoSearch(string query) { string results = “”; if (HttpContext.Current.Cache[query] == null) { lock (_cacheLock) { if (HttpContext.Current.Cache[query] == null) { results = GetResultsFromSlowDb(query); HttpContext.Current.Cache.Add(query, results, null, DateTime.Now.AddHours(1), Cache.NoSlidingExpiration, CacheItemPriority.Normal, null); } else { results […]