Tag: thread safety

Dictionary 的神秘行为

我正在开发一个基于Asp.net MVC 3.0并使用Mono-2.10.8(Windows 7)的庞大系统。 一切都很好,直到几天前。 在我的API中,我有几个使用词典的实用程序类。 例如,像这样: public static class KeyUtility { static KeyUtility() { Alphabet = new[] { ‘A’, ‘B’, ‘C’, ‘D’, ‘E’, ‘F’, ‘G’, ‘H’, ‘J’, ‘K’, ‘L’, ‘M’, ‘N’, ‘P’, ‘R’, ‘S’, ‘T’, ‘U’, ‘V’, ‘X’, ‘Y’, ‘Z’, ‘0’, ‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’, ‘9’ }; ReverseAlphabet = Alphabet […]

SqlConnection线程安全吗?

我有一个Log类,它将日志放在Windows日志和SQL表中。 为了优化我的代码,我想只使用一个SqlConnection 。 在MSDN中,它说:此类型的任何public static (在Visual Basic中为Shared)成员都是线程安全的。 任何实例成员都不保证是线程安全的。 我的问题是: private static readonly SqlConnection conn = new SqlConnection(ConfigParameters.Instance.UIDConnection); 它是线程安全的吗? 如果是,使用Open()和Close() ? 如果没有,如何正确使用SqlConnection ? 这是我的完整类代码: private static readonly SqlConnection conn = new SqlConnection(ConfigParameters.Instance.UIDConnection); public static long WriteLog(string sSource, string sMessage, int iErrorCode, EventLogEntryType xErrorType) { // Windows Logs if (ConfigParameters.Instance.WindowsLog) EventLog.WriteEntry(sSource, sMessage, xErrorType, iErrorCode); // SQL Logs […]

CultureInfo线程安全

我有一个解决一些文本的multithreading应用程序,它需要使用英文文化信息来解析这个文本中的数字。 所以,我不想每次调用解析函数时都创建EngCulture。 目前我正在通过EngCulture作为参数,但我对此并不满意。 我想将EngCulture定义为静态成员,因此它将由线程共享。 Msdn文档说“这种类型的任何公共静态(在Visual Basic中共享)成员都是线程安全的。任何实例成员都不能保证是线程安全的。” 我只是使用以下函数,所以我怎么知道TryParse是否使用EngCulture的任何实例成员? public static CultureInfo EngCulture = new CultureInfo(“en-US”, false); void parser() { if (int.TryParse(value, NumberStyles.Number, EngCulture, out num))… }

如何轻松使这个计数器属性线程安全?

我在类中有属性定义,我只有计数器,这必须是线程安全的,这不是因为get和set不在同一个锁中,怎么做? private int _DoneCounter; public int DoneCounter { get { return _DoneCounter; } set { lock (sync) { _DoneCounter = value; } } }

替换ObservableCollection?

我正在寻找一个线程安全的ObservableCollection的替代品,在UI线程上引发事件,最好有一个AddRange方法。 我已经看到在这里和其他地方发布了一些实现,但我更喜欢已经过测试和validation的实现,而且我不需要维护自己。 所以有人能指出我这样的替代品,最好通过NuGet获得吗?

为什么标准C#事件调用模式是线程安全的,没有内存屏障或缓存失效? 类似的代码怎么样?

在C#中,这是以线程安全方式调用事件的标准代码: var handler = SomethingHappened; if(handler != null) handler(this, e); 其中,可能在另一个线程上,编译器生成的add方法使用Delegate.Combine创建一个新的多播委托实例,然后在编译器生成的字段上设置该实例(使用互锁比较交换)。 (注意:出于这个问题的目的,我们不关心在事件订阅者中运行的代码。假设它在删除时是线程安全且健壮的。) 在我自己的代码中,我想按照以下方式做类似的事情: var localFoo = this.memberFoo; if(localFoo != null) localFoo.Bar(localFoo.baz); 其中this.memberFoo可以由另一个线程设置。 (这只是一个线程,所以我不认为它需要联锁 – 但也许这里有副作用?) (而且,显然,假设Foo是“足够不可变的”,我们在这个线程上使用它时不会主动修改它。) 现在我理解这是线程安全的明显原因 :从引用字段读取是primefaces的。 复制到本地可确保我们不会获得两个不同的值。 ( 显然只能从.NET 2.0保证,但我认为它在任何理智的.NET实现中都是安全的吗?) 但我不明白的是:被引用的对象实例所占用的内存如何? 特别是在缓存一致性方面? 如果“writer”线程在一个CPU上执行此操作: thing.memberFoo = new Foo(1234); 什么保证分配新Foo的内存不会出现在“读取器”运行的CPU的缓存中,具有未初始化的值? 什么确保localFoo.baz (上面)不读取垃圾? (跨平台的保证有多好?在Mono上?在ARM上?) 如果新创建的foo恰好来自游泳池呢? thing.memberFoo = FooPool.Get().Reset(1234); 从内存的角度来看,这似乎没有什么不同,只是一个新的分配 – 但是.NET分配器可能会让第一个案例有效吗? 在我提出这个问题时,我的想法是,需要一个内存屏障来确保 – 不是因为读取依赖而无法移动内存访问 – 而是作为CPU清除任何缓存失效的信号。 […]

这是C#的有效,懒惰,线程安全的Singleton实现吗?

我实现了像这样的Singleton模式: public sealed class MyClass { … public static MyClass Instance { get { return SingletonHolder.instance; } } … static class SingletonHolder { public static MyClass instance = new MyClass (); } } 从谷歌搜索C#Singleton实现,似乎这不是在C#中做事的常用方法。 我发现了一个类似的实现,但SingletonHolder类不是静态的,并且包含一个显式(空)静态构造函数。 这是实现Singleton模式的有效,懒惰,线程安全的方法吗? 还是有什么我想念的?

在ASP.NET中运行时创建动态锁

以下假设对此代码有效吗? 我在代码下面加了一些背景信息,但我认为它不相关。 假设1:由于这是一个单一的应用程序,我假设它将由一个进程处理。 因此,静态变量在线程之间共享,并且静态地声明我的锁对象集合是有效的。 假设2:如果我知道该值已经在字典中,我不需要锁定读取。 我可以使用ConcurrentDictionary,但我相信这个是安全的,因为我没有枚举(或删除),并且当我调用UnlockOnValue()时,该值将存在而不会改变。 假设3:我可以锁定Keys集合,因为即使底层数据结构存在,该引用也不会改变。 private static Dictionary LockList = new Dictionary(); private void LockOnValue(String queryStringValue) { lock(LockList.Keys) { if(!LockList.Keys.Contains(queryStringValue)) { LockList.Add(screenName,new Object()); } System.Threading.Monitor.Enter(LockList[queryStringValue]); } } private void UnlockOnValue(String queryStringValue) { System.Threading.Monitor.Exit(LockList[queryStringValue]); } 然后我会使用这样的代码: LockOnValue(Request.QueryString[“foo”]) //Check cache expiry //if expired //Load new values and cache them. //else //Load cached values UnlockOnValue(Request.QueryString[“foo”]) 背景:我在ASP.NET中创建一个应用程序,它根据查询字符串中的单个用户定义变量下载数据。 […]

“switch”语句评估是否是线程安全的?

请考虑以下示例代码: class MyClass { public long x; public void DoWork() { switch (x) { case 0xFF00000000L: // do whatever… break; case 0xFFL: // do whatever… break; default: //notify that something going wrong throw new Exception(); } } } 忘掉片段的无用性:我怀疑是关于switch语句的行为。 假设x字段只能有两个值: 0xFF00000000L或0xFFL 。 上面的开关不应该属于“默认”选项。 现在想象一个线程正在执行“x”等于0xFFL的开关,因此第一个条件将不匹配。 同时,另一个线程将“x”变量修改为0xFF00000000L。 我们知道64位操作不是primefaces操作,因此变量将首先将较低的dword置零,然后将较低的dword置零(反之亦然)。 如果在“x”为零时(即在新的分配期间)完成开关中的第二个条件,我们是否会陷入不受欢迎的“默认”情况?

将线程安全性添加到IDisposable对象的正确方法是什么?

想象一下IDisposable接口的实现,它有一些公共方法。 如果在多个线程之间共享该类型的实例并且其中一个线程可以处置它,那么确保其他线程在处置后不尝试使用该实例的最佳方法是什么? 在大多数情况下,在处理对象之后,其方法必须知道它并抛出ObjectDisposedException或者可能是InvalidOperationException或者至少通知调用代码做错了什么。 我是否需要为每种方法进行同步 – 尤其是在检查它是否被丢弃时? 使用其他公共方法的所有IDisposable实现是否需要是线程安全的? 这是一个例子: public class DummyDisposable : IDisposable { private bool _disposed = false; public void Dispose() { _disposed = true; // actual dispose logic } public void DoSomething() { // maybe synchronize around the if block? if (_disposed) { throw new ObjectDisposedException(“The current instance has been disposed!”); } // […]