Tag: 锁定

C#threading – 锁定对象

我想在ac#app中锁定一个“盒装”对象,这不可能吗? class t { System.Object t_x = new object(); public t(int p) { t_x = p; } public void w() { lock (t_x) { for (int i = 0; i < 4; i++) { { t_x = ((int)t_x) + 1; Console.WriteLine(t_x); Thread.Sleep(1000); } } } } } 在另一个类中,我可以开始2个线程: Thread b1 = new Thread(new ThreadStart(t1.w)); b1.Start(); […]

c#锁定传递给方法的引用 – 不好的做法?

我有一个类似的方法: public static void DoSomething (string param1, string param2, SomeObject o) { //….. lock(o) { o.Things.Add(param1); o.Update(); // etc…. } } 几点: 用这种方式锁定不好的做法? 我应该锁定private static object吗? 如果是这样,为什么?

我是否需要将线程访问同步到int?

我刚刚编写了一个由多个线程同时调用的方法,我需要跟踪所有线程何时完成。 代码使用这种模式: private void RunReport() { _reportsRunning++; try { //code to run the report } finally { _reportsRunning–; } } 这是代码中唯一一个_reportsRunning的值被更改的地方,该方法需要大约一秒钟才能运行。 偶尔当我有超过六个左右的线程一起运行报告时,_reportsRunning的最终结果可以降到-1。 如果我在锁中包含对_runningReports++和_runningReports–的调用,那么该行为似乎是正确且一致的。 所以,问题是:当我在C ++中学习multithreading时,我被教导你不需要同步调用递增和递减操作,因为它们总是一个汇编指令,因此线程不可能在中间切换-呼叫。 我是否正确地教过,如果是这样,那对C#来说怎么回事?

测试条件然后锁定然后重新测试条件是好的

可能重复: 在.net中双重检查锁定 编辑:许多编辑澄清这个问题不是关于单身人士 我发现自己编写的代码如下: if(resourceOnDiskNeedsUpdating) { lock(lockObject) { if(resourceOnDiskNeedsUpdating) // has a previous thread already done this? UpdateResourceOnDisk(); } } return LoadResourceFromDisk(); UpdateResource()是一个缓慢的操作。 这种模式有意义吗? 还有更好的选择吗?

C# – 锁定Mutex的问题

我有一个Web应用程序,可以控制哪些Web应用程序从我们的负载均衡器获得流量。 Web应用程序在每个服务器上运行。 它跟踪ASP.NET应用程序状态中对象中每个应用程序的“进入或退出”状态,并且只要状态发生更改,就将对象序列化为磁盘上的文件。 Web应用程序启动时,将从文件反序列化状态。 虽然网站本身只获得了几个请求,但是它很少访问的文件,我发现由于某种原因,在尝试读取或写入文件时发生冲突非常容易。 这种机制需要非常可靠,因为我们有一个自动化系统,可以定期对服务器进行滚动部署。 在任何人发表任何有关上述任何一个问题的评论之前,请允许我简单地说,解释其背后的推理会使这个post比现在更长,所以我想避免搬山。 也就是说,我用来控制文件访问的代码如下所示: internal static Mutex _lock = null; /// Executes the specified delegate on /// the filesystem copy of the . /// The work done on the file is wrapped in a lock statement to ensure there are no /// locking collisions caused by attempting to save and load […]

C# – 从字典中获取时锁定资源

我有一个跟踪对象的Dictionary(ClientObject)。 字典和ClientObject都由多个线程访问。 当我修改或读取此字典中的任何对象时,我使用ReaderWriterLockSlim(rwl_clients)在字典上获取读取或写入锁定,然后获取对实际对象的独占锁定。 我只是想知道我是否正确使用这些.net线程设施 例: rwl_clients.EnterReadLock(); ClientObject clobj; if(!m_clients.TryGetValue(key, out clobj)) return; rwl_clients.ExitReadLock(); SomeMethod(clobj); SomeMethod(ClientObject clobj)会执行以下操作: lock(clobj) { /// Read / Write operations on clobj } 从一个线程中的字典中获取和锁定值(ClientObject)是否意味着其他线程将尊重该锁定? 换句话说,.net将字典中的值视为单个资源(而不是副本),因此会尊重所有线程中该资源的锁定吗? 还有一个问题,当从字典中删除资源时 – 我应该在执行Remove()之前将其锁定 例: rwl_clients.EnterWriteLock(); ClientObject clobj; if(m_clients.TryGetValue(key, out clobj)) { lock(clobj) { m_clients.Remove(key); } } rwl_clients.ExitWriteLock(); 我从这个网站上学到了很多,并感谢任何回复! 谢谢。

锁定多个线程中的变量

我是C#的新手,我想询问我是否在MULTI THREADS(伪代码)中遇到这种情况: public class ClassA { ClassB c = new ClassB(); public void someMethod() { c.myVar = 1; // Some other stuff c.myVar = 0; } } public class ClassB { internal int myVar; public void MethodA() { if(myVar = 1) myVar = 0; } } 如果someMethod()和MethodA()可以在单独的线程中处于活动状态,则MethodA()可以将if语句计算为true; 但在设置myVar = 0 , someMethod()设置myVar = 0使得在MethodA()中将myVar设置为0是不正确的! 基本上,我如何锁定myVar […]

锁定是否确保从缓存中刷新读取和写入? 如果是这样,怎么样?

我正在阅读这篇关于无锁线程同步的MSDN文章 。 这篇文章似乎推断,只要你在访问共享变量之前输入一个锁,那么这些变量将是最新的(至少在.Net 2.0中)。 我想到这是怎么可能的? .Net中的锁只是所有线程在访问内存之前检查的任意对象,但锁本身并不知道正在访问的内存位置。 如果我有一个线程更新变量,甚至整个内存块,那么当进入/退出锁时,这些更新如何保证从CPU缓存刷新? 所有内存访问是否在锁内有效地变为易失性?

为什么这段代码会锁定我的文件?

我已经缩小到这个方法,但我不明白为什么它锁定文件。 我相信你可以用类似的东西 using( something) { //do stuff here } 但我不确定A)是否会解决问题,或者B)如果确实如此,那就是正确的方法。 有任何想法吗? [DllImport(“user32.dll”, CharSet = CharSet.Auto)]private static extern Int32 SystemParametersInfo(UInt32 action, UInt32 uParam, String vParam, UInt32 winIni); private static readonly UInt32 SPI_SETDESKWALLPAPER = 0x14; private static readonly UInt32 SPIF_UPDATEINIFILE = 0x01; private static readonly UInt32 SPIF_SENDWININICHANGE = 0x02; private void SetWallpaper(string path) { try { Image […]

病毒扫描程序锁定和删除临时文件 – 处理它们的最佳方法是什么?

我的应用程序处理来自不同来源的电子邮件,例如Outlook和IMAP邮箱。 在解析它们之前,我将它们写入临时目录(将它们保留在内存中不是一个选项)。 在解析时,我可能正在写临时目录的附件(例如,如果它们太大而无法保留在内存中或用于全文提取)。 但在野外,有两件事情发生在一开始似乎很奇怪,但都可以追溯到病毒扫描程序的行为: 我有时无法打开几毫秒前我自己写过的文件。 它们显然被病毒扫描程序锁定,以确保它们是干净的。 我得到一个例外。 如果病毒扫描程序认为文件存在危险,则会在某个时间点将其删除。 为了应对这种行为,我写了一些方法,如果打开失败再次尝试,或者如果文件存在则进行一些检查,但是我无法在应用程序的每个部分使用它们(第三方代码,例如filter) ,所以事情变得更好,但不是100%完美,因为这个原因,我的源代码看起来很难看。 你如何应对病毒扫描程序?