Tag: thread safety

在C#下使用Int64会对32位处理器造成危险

我在MS文档中读到,在32位Intel计算机上分配64位值不是primefaces操作; 也就是说,操作不是线程安全的。 这意味着如果两个人同时为静态Int64字段分配值,则无法预测该字段的最终值。 三部分问题: 这是真的吗? 这是我在现实世界中会担心的吗? 如果我的应用程序是multithreading的,我真的需要用锁定代码包围我的所有Int64分配吗?

什么是线程安全(C#)? (字符串,数组,……?)

我对C#很新,所以请耐心等待。 我对线程安全有点困惑。 什么时候是线程安全的东西什么时候不安全? 从字段中读取 (只读取之前初始化的内容)总是线程安全吗? //EXAMPLE RSACryptoServiceProvider rsa = new RSACrytoServiceProvider(); rsa.FromXmlString(xmlString); //Is this thread safe if xml String is predifined //and this code can be called from multiple threads? 从数组或列表访问对象始终是线程安全的(如果您使用for循环进行枚举)? //EXAMPLE (a is local to thread, array and list are global) int a = 0; for(int i=0; i<10; i++) { a += array[i]; a […]

不可重入的计时器

我有一个函数,我想每x秒调用一次,但我希望它是线程安全的。 我在创建计时器时可以设置此行为吗? (我不介意我使用哪个.NET计时器,我只是希望它是线程安全的)。 我知道我可以在我的回调函数中实现锁,但我认为如果它在计时器级别会更优雅。 我的回调函数和环境与UI无关。 [编辑1]我只是不希望我的回调函数中有多个线程。 [编辑2]我想将锁定保持在计时器级别内,因为计时器负责何时调用我的回调,这里有一种特殊情况,当我不想调用我的回调函数时。 所以我觉得什么时候打电话是计时器的责任 。

使用.Net中的Dictionary 进行线程安全

我有这个function: static Dictionary KeyValueDictionary = new Dictionary(); static void IncreaseValue(int keyId, int adjustment) { if (!KeyValueDictionary.ContainsKey(keyId)) { KeyValueDictionary.Add(keyId, 0); } KeyValueDictionary[keyId] += adjustment; } 我原本认为这不是线程安全的。 但是,到目前为止,在测试它时,我没有看到同时从多个线程调用它时的任何exception。 我的问题:它是线程安全还是我到目前为止幸运? 如果它是线程安全的那么为什么?

SqlConnection / SqlCommand线程安全吗?

我目前正在创建一个WCF Web服务。 作为其工作的一部分,遗憾的是需要进行一些相当密集的计算,但幸运的是,这些计算可以在对Web服务的调用之间共享。 实际上 – 我们只需要进行一次计算,所有后来的调用都可以获得好处。 但是,由于WCF没有共享应用程序状态,因此在单实例模式下设置WCF似乎是合乎逻辑的。 (每个客户端都需要进行一些计算,迫使我们重新计算它们,这可能是正常的,或者每次调用都是站不住脚的,这是不可能的) 但是,我不太熟悉保护multithreading的代码。 我一直在阅读它,因为我们的WCF代码都没有写入共享状态(除了计算位,这很容易保护)我几乎确信我不需要改变任何东西。 但是有一个障碍 – 我们使用SqlConnection和SqlCommand与我们的后端进行通信,我不确定我是否可以指望这些是线程安全的? 编辑:我应该澄清命令/连接始终是方法的本地。 我们正在谈论一种模式: using sqlConn = new SqlConnection(…) { try { sqlConn.Open() } catch () { throw new FaultException(); } var cmd = new SqlCommand(“Some SQL”, sqlConn); var reader = cmd.ExecuteReader(); //Read the stuff reader.Close(); //Return something } 结束编辑 我在MSDN上查找了SqlCommand类: http : //msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.aspx其中说:“任何公共静态(在Visual […]

C#的使用语句是否中止?

我刚刚读完了“C#4.0 in a Nutshell”(O’Reilly),我认为这对于愿意转向C#的程序员来说是一本很好的书,但它让我感到疑惑。 我的问题是using语句的定义。 根据这本书(第138页), using (StreamReader reader = File.OpenText(“file.txt”)) { … } 恰好相当于: StreamReader reader = File.OpenText(“file.txt”); try { … } finally { if (reader != null) ((IDisposable)reader).Dispose(); } 但是,假设这是真的,并且此代码在单独的线程中执行。 此线程现在使用thread.Abort()中止,因此抛出ThreadAbortException并假设线程正好在初始化读取器之后和输入try..finally子句之前。 这意味着读者不会被处置! 一种可能的解决方案是以这种方式编码: StreamReader reader = null; try { reader = File.OpenText(“file.txt”); … } finally { if (reader != null) ((IDisposable)reader).Dispose(); } 这将是中止安全的。 […]

如何实现多索引字典?

基本上我想要像Dictionary 这样的东西,但不是(正如我在其他问题中看到的那样)和AND中的键,但是在OR中。 为了更好地解释:我希望能够在字典中找到只提供其中一个键的元素,而不是两者。 我还认为我们应该考虑线程安全性以及轻松扩展到Dictionary 解决方案的能力……

为什么这段代码不能certificate读/写的非primefaces性?

阅读这个问题 ,我想测试一下我是否能够certificate对这种操作的primefaces性无法保证的类型的读写非primefaces性。 private static double _d; [STAThread] static void Main() { new Thread(KeepMutating).Start(); KeepReading(); } private static void KeepReading() { while (true) { double dCopy = _d; // In release: if (…) throw … Debug.Assert(dCopy == 0D || dCopy == double.MaxValue); // Never fails } } private static void KeepMutating() { Random rand = new […]

null coalesce操作符线程是否安全?

所以这就是问题的关键:Foo.Bar可以返回null吗? 为了澄清,’_bar’在被评估为非null并且返回它之前可以设置为null吗? public class Foo { Object _bar; public Object Bar { get { return _bar ?? new Object(); } set { _bar = value; } } } 我知道使用以下get方法并不安全,并且可以返回null值: get { return _bar != null ? _bar : new Object(); } 更新: 另一种看待同一问题的方法,这个例子可能更清楚: public static T GetValue(ref T value) where T : class, new() { […]

C#自动实现的静态属性是否是线程安全的?

我想知道C#是否自动实现了属性,比如public static T Prop { get; set; } public static T Prop { get; set; } ,是否是线程安全的。 谢谢!