Tag: 线程安全

播种多个随机数发生器

我最近在另一篇文章的评论中讨论了相同类型的多个随机数生成器的初始化,在讨论中我们询问了以下问题: 1)使用不同的种子创建相同随机数生成器的多个实例并在程序的不同部分使用这些随机数生成器是一个好主意吗? 2)特别是,使用.Net Random类创建随机数生成器的技术,如下所示,并在不同的程序上下文中使用每个RNG会导致问题: int size = 64; // The number of RNGs to use int seed; // Get seed using some normal technique Random[] r = new Random[size]; for (int i = 0; i < size; i++) { r[i] = new Random(seed + i); } 3)如果需要多个随机数流,你会建议什么? 4)当需要线程安全时,您如何建议生成随机数?

在迭代时修改另一个线程的列表(C#)

我正在使用foreach循环遍历元素列表,如下所示: foreach (Type name in aList) { name.doSomething(); } 但是,在另一个线程中我称之为 aList.Remove(Element); 在运行时,这会导致InvalidOperationException:Collection已被修改; 枚举操作可能无法执行。 处理这个问题的最佳方法是什么(即使以性能为代价,我会更加简单)? 谢谢!

锁定和管理锁定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 […]

我该如何处理“CrossThreadMessagingException”?

我有一个简单的代码,通过标签组件在我的GUI中显示时间顺序。 此代码位于计时器的tick事件中。 有时,我得到“Microsoft.VisualStudio.Debugger.Runtime.CrossThreadMessagingException”,我不知道为什么? 我怎么能抓住这个例外? 如何更改我的代码以避免出现此exception? //Calculate and show elapsed time TimeSpan ElapsedTime = DateTime.Now – this.StartTime; this.LabelElapsedTime.Text = String.Format(“{0:00}:{1:00}:{2:00}”, ElapsedTime.Hours, ElapsedTime.Minutes, ElapsedTime.Seconds);

SoapHttpClientProtocol线程安全吗?

我使用VS 2008(c#)的“添加Web引用”function创建了一个Web服务代理。 生成的类派生自SoapHttpClientProtocol 我可以在单例中只存储一个代理实例吗? 它是线程安全吗? 呼叫之间是否存在阻止我这样做的状态?

我需要在C#.Net中创建一个Thread安全的静态变量

好吧,它比问题复杂一点。 class A { static int needsToBeThreadSafe = 0; public static void M1() { needsToBeThreadSafe = RandomNumber(); } public static void M2() { print(needsToBeThreadSafe); } } 现在我要求在M1()和M2()之间调用’needsToBeThreadSafe’保持线程安全。

什么是暂停和恢复线程的替代方法?

自.NET 2.0以来, Thread.Suspend()和Thread.Resume()这两个方法已经过时了。 为什么? 什么是其他替代品和任何例子?

什么.NET 4.0 System.Collections.Concurrent集合在function中添加到.NET 3.0 SynchronizedCollection?

.NET 4.0引入了System.Collections.Concurrent命名空间: “ System.Collections.Concurrent命名空间提供了几个线程安全的集合类,每当多个线程同时访问集合时,应该使用它们代替System.Collections和System.Collections.Generic命名空间中的相应类型” BlockingCollection类 ConcurrentBag类 ConcurrentQueue类 ConcurrentDictionary类 OrderablePartitioner类 Partitioner类 IProducerConsumerCollection接口 SynchronizedCollection类(自.NET 3.0起可用): “提供一个线程安全的集合,其中包含generics参数指定的类型的对象作为元素” …位于System.Collections.Generic命名空间中。 那么,为什么SynchronizedCollection类是线程安全的而不是并发的? 具体是什么使SynchronizedCollectiongenerics类与System.Collections.Concurrent集合不同且不兼容? 更新:让我重新解释一个问题:属于System.Collections.Concurrent命名空间的所有generics集合中的共同点和区分新特性是什么,它在SynchronizedCollectiongenerics类中不存在(并且在使用时不可能)? 我将标题更改为“.NET 4.0 System.Collections.Concurrent集合在function中添加到.NET 3.0 SynchronizedCollection ?”。 但大多数情况下,我很想知道是什么让它无法在.NET 3.0的基础上进行 Update2 :关于说明: “这个问题可能已经有了答案: SynchronizedCollection和其他并发集合有什么区别? “ 答案是在我的问题的背景下混淆 – 新function是进化的(使用预4.0版function)还是革命性的(在.NET 4.0之前不可用)?

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

(问题修改):到目前为止,答案都包括一个线程重新进入锁定区域的线程,通过递归之类的东西,您可以在其中跟踪单个线程进入锁定两次的步骤。 但是有可能以某种方式,对于单个线程(可能来自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); […]

这个非锁定的TryGetValue()字典是否可以访问线程安全?

private object lockObj = new object(); private Dictionary dict = new Dictionary(); public string GetOrAddFromDict(int key) { string value; // non-locked access: if (dict.TryGetValue(key, out value)) return value; lock (this.lockObj) { if (dict.TryGetValue(key, out value)) return value; string newValue = “value of ” + key; // place long operation here dict.Add(key, newValue); return newValue; } […]