Tag: 线程线程安全

可以通过多个线程访问List 吗?

我打算在多个线程之间共享一个List。 该列表将在更改期间锁定,这种更改很少发生。 如果同时通过列表从不同的线程进行多次迭代,是否存在线程安全问题?

连续检查队列

我想要一个函数在一个线程上连续检查队列是否有新的添加 显然,可以选择连续循环播放睡眠,但我希望减少浪费。 我考虑了某种类型的等待句柄,然后让队列发出信号,但我不能安全地重写Enqueue,因为它不是虚拟的。 现在我正在考虑封装一个Queue作为我的最佳选择,但是如果有更好的选择,我想问你们好人! 我的想法是:我希望许multithreading访问套接字连接,同时保证他们只读取其消息的响应,所以我将有一个线程调度和读取响应,然后用响应数据执行回调(以纯文本格式)

设计线程安全类

阅读MSDN文档时,它总是让您知道类是否是线程安全的。 我的问题是你如何设计一个线程安全的类? 我不是在谈论用锁定调用类我意味着我正在为Microsoft创建XXX class \ object而我想说它是“线程安全”我需要做什么?

C#中静态初始化程序的线程安全性

每个人都说静态初始化程序是线程安全的,但我担心一个特定的细节。 比方说我有 static class MyStaticClass { public static readonly object myField = MyOtherClass.GetNewObject(); } static class MyOtherClass { public static object GetNewObject() { /* arbitrary code that returns a new object */ } } 当MyStaticClass.myField尚未初始化时,C#保证以下哪一项? 如果线程1和2尝试一起访问myField ( GetNewObject顺序),则在线程2读取myField之前, GetNewObject将开始执行。 如果线程1和2尝试一起访问myField ( GetNewObject顺序),则在线程2读取myField之前, GetNewObject将完成执行。 一般来说CLR怎么样:如果它的保证与C#不同,它们在哪些方面有所不同? 在更新版本的.NET框架中是否更改了行为? 注意: 这是一个棘手的问题,我认为完整的答案可能会提到静态构造函数和静态初始化程序之间的区别,以及它们如何与beforefieldinit交互以产生声明的结果。

请帮助我使这段代码线程安全

我在使数据加载和过滤线程安全方面遇到了一些问题。 我的控件基类上的以下代码通过BackgroundWorker处理所有数据填充。 这往往会在“this.DataWorker.RunWorkerAsync()”上抛出错误,说明BackgroundWorker正忙。 /// /// Handles the population of the form data. /// /// Whether to pull data back from the WebService. public void Populate(bool reload) { if (!this.DataWorker.IsBusy) { // Disable the filter options IvdSession.Instance.FilterManager.SetEnabledState(this.GetType(), false); // Perform the population this.DataWorker.RunWorkerAsync(reload); } else if (!reload) { // If the data worker is busy and […]

从其他类的线程安全更新WinForm控件

有人可以帮我解决以下问题: MainForm和LWriter有两个类。 以下是来自LWriter的方法,除了写入文件之外,还向RichTextBox控件发送一些更新(通过mainForm.UpdateLog(text))。 一切正常,但是,这个WriteOutput方法也做了一些广泛的处理,在计算过程中冻结了表单。 我认为WriteOutput应该封装在一个单独的线程中。 有人可以帮我解释如何将WriteOutput(LWriter类)放在一个线程中,然后以安全的方式从mainFrom调用mainForm.UpdateLog()吗? 我是线程的新手,因此非常感谢帮助。 public void WriteOutput(string output, Links[] links) { try { using (StreamWriter sw = new StreamWriter(output)) { for (int x= 1; x<links.Length;x++) { … sw.WriteLine( … ); sw.Flush(); } mainForm.UpdateLog(); } } catch(Exception e) { … } }

关于SyncRoot模式的一些说明:使用此模式的正确方法是什么?

我读了一些关于SyncRoot模式的内容,作为避免死锁的一般规则。 阅读几年前的问题(见此链接 ),我想我明白这种模式的一些用法可能是不正确的。 特别是,我专注于这个主题的以下句子: 您会注意到System.Collections中许多集合上的SyncRoot属性。 在回顾中,我认为这个属性是一个错误……请放心,我们不会犯这个错误,因为我们构建这些集合的通用版本。 实际上,例如, List类不实现SyncRoot属性,或者更准确地说它是显式实现的(请参阅此答案 ),因此必须强制转换为ICollection才能使用它。 但是这篇评论认为公开私有SyncRoot字段与锁定它一样糟糕(请参阅此答案 ),这也在本评论中得到证实。 因此,如果我理解正确,当我实现非线程安全的数据结构时,由于它可以在multithreading上下文中使用,我不应该(实际上,我不能)提供SyncRoot属性。 但是我应该让开发人员(将使用此数据结构)的任务是将其与私有SyncRoot对象相关联,如下面的示例代码所示。 public class A { private MyNonThreadSafeDataStructure list; private readonly object list_SyncRoot = new object; public Method1() { lock(list_SyncRoot) { // access to “list” private field } } public Method2() { lock(list_SyncRoot) { // access to “list” private field } } } 总之,我了解同步/锁定的最佳实践应如下所示: […]

在C#实例方法中,’this’可以为null吗?

我有一种情况,很少有对象的队列出列空值。 对Enqueue的唯一调用是在类本身内: m_DeltaQueue.Enqueue(this); 很少,在以下代码中,null会从此队列中出列(静态方法): while (m_DeltaQueue.Count > 0 && index++ < count) if ((m = m_DeltaQueue.Dequeue()) != null) m.ProcessDelta(); else if (nullcount++ < 10) { Core.InvokeBroadcastEvent(AccessLevel.GameMaster, "A Rougue null exception was caught, m_DeltaQueue.Dequeue of a null occurred. Please inform an developer."); Console.WriteLine("m_DeltaQueue.Dequeue of a null occurred: m_DeltaQueue is not null. m_DeltaQueue.count:{0}", m_DeltaQueue.Count); } 这是生成的错误报告: [Jan […]

等待Task.Run(()=> semaphore.WaitOne())有什么问题吗?

标题说明了一切。 await Task.Run(() => semaphore.WaitOne());有什么问题await Task.Run(() => semaphore.WaitOne()); ? System.Threading.Semaphore不是线程仿射的,所以我不认为会有问题。 我知道SemaphoreSlim类是可用的,但我需要进行跨进程同步,而SemaphoreSlim不会这样做。 或者我可以/应该创建自己的自定义类型的WaitHandle吗?

加入线程时是否需要内存屏障?

如果一个线程A生成另一个线程B,其唯一目的是写入变量V然后等待它终止,那么是否需要内存屏障以确保后续读取线程A上的V是新鲜的? 我不确定终止/加入操作中是否有任何隐含的障碍使它们变得多余。 这是一个例子: public static T ExecuteWithCustomStackSize (Func func, int stackSize) { T result = default(T); var thread = new Thread( () => { result = func(); Thread.MemoryBarrier(); // Required? } , stackSize); thread.Start(); thread.Join(); Thread.MemoryBarrier(); // Required? return result; } 是否需要上述代码段中的两个(或更多)障碍?