Questions tagged «multithreading»

多线程是计算机或程序通过利用多个并发的执行流(通常称为线程)来并发或异步执行工作的能力。

10
在任何情况下,最好使用普通的旧Thread对象而不使用较新的结构之一吗?
我在博客文章和SO上看到了很多人,他们避免或建议不要Thread在最新版本的C#中使用该类(我的意思是当然是4.0+,加上Task&朋友)。甚至在以前,就存在这样的争论:在许多情况下,ThreadPool该类可以替换普通的旧线程的功能。 另外,其他专用机制进一步使Thread该类不再那么吸引人,例如Timers替换了丑陋的Thread+ Sleep组合,而对于GUI我们拥有BackgroundWorker,等等。 但是,Thread对于某些人(包括我自己)来说,这似乎仍然是一个非常熟悉的概念,这些人在遇到涉及某种并行执行的任务时,会直接跳到使用旧的Thread类。我最近一直在想是否应该修改我的方式。 所以我的问题是,在任何情况下有必要使用普通的旧Thread对象代替上述构造之一是有必要的还是有用的?
112 c#  .net  multithreading 

5
LinkedBlockingQueue与ConcurrentLinkedQueue
我的问题涉及到这个问题,刚才问。在使用队列在生产者线程与使用者线程之间进行通信的情况下,人们通常会建议使用LinkedBlockingQueue或ConcurrentLinkedQueue吗? 与另一种相比,使用一种有什么优点/缺点? 从API角度看,我的主要区别是a LinkedBlockingQueue可以有选择地限制。

3
为什么锁对象必须是静态的?
使用私有静态只读对象进行多线程锁定非常普遍。我了解到,private通过拧紧封装减少了锁定对象的入口,因此可以访问最基本的对象。 但是为什么要静态呢? private static readonly object Locker = new object(); 最后,该字段仅在我的班级中使用,我也可以只使用它: private readonly object Locker = new object(); 任何意见? 更新: 作为示例,我粘贴了此代码(仅作为示例)。我可以在此上使用静态或非静态储物柜,并且两者都可以正常工作。考虑下面的答案,我应该像这样定义我的储物柜?(对不起,下周我要接受采访,需要了解每个细节:) private readonly object Locker = new object(); 这是代码: private int _priceA; private int _priceB; private EventWaitHandle[] _waithandle; private readonly IService _service; //ctor public ModuleAViewModel(IService service) { _service = service; …

11
在高流量情况下在ASP.NET中使用ThreadPool.QueueUserWorkItem
我一直给人的印象是,即使在ASP.NET中,也将ThreadPool用于(例如,非关键的)短期后台任务被认为是最佳实践,但随后我发现这篇文章似乎暗示了其他方面-争论是您应该离开ThreadPool来处理与ASP.NET相关的请求。 因此,到目前为止,这是我一直在执行小型异步任务的方式: ThreadPool.QueueUserWorkItem(s => PostLog(logEvent)) 而文章的建议,而不是明确地创建一个线程,类似于: new Thread(() => PostLog(logEvent)){ IsBackground = true }.Start() 第一种方法具有受管理和限制的优点,但有可能(如果本文是正确的)后台任务然后争用ASP.NET请求处理程序争用线程。第二种方法释放了ThreadPool,但代价是不受限制,因此有可能消耗太多资源。 所以我的问题是,文章中的建议正确吗? 如果您的网站流量太多,以至于ThreadPool变满了,那么最好带外使用,或者完整的ThreadPool暗示您无论如何都会达到资源的极限,在这种情况下,不应该尝试启动自己的线程? 澄清:我只是在询问小型非关键性异步任务(例如,远程日志记录),而不是需要单独流程的昂贵工作项(在这种情况下,我同意您需要一个更强大的解决方案)。

7
哪个对node.js上的并发任务更好?纤维?网络工作者?还是线程?
我前一段时间偶然发现了node.js,非常喜欢。但是很快我发现它严重缺乏执行CPU密集型任务的能力。因此,我开始使用Google搜索,并找到了解决这些问题的答案:光纤,Webworkers和线程(go-a-gogo)。现在使用哪个是一个混乱的问题,肯定需要使用其中的一个-毕竟,拥有一台只擅长IO且无其他优点的服务器的目的是什么?需要建议! 更新: 我在想一种落后的方法。只是需要建议。现在,我想到的是:让我们来一些线程(使用thread_a_gogo或webworkers)。现在,当我们需要更多它们时,我们可以创建更多。但是在创建过程中会有一些限制。(不是系统暗示的,但可能是因为开销)。现在,当我们超过限制时,我们可以派生一个新节点,并开始在该节点上创建线程。这样,它可以一直持续到我们达到某个极限(毕竟,过程也有很大的开销)。当达到此限制时,我们开始排队任务。每当线程空闲时,就会为它分配一个新任务。这样,它可以顺利进行。 所以,这就是我的想法。这个主意好吗?我对所有这些过程和线程东西还是有点陌生​​,所以没有任何专业知识。请分享您的意见。 谢谢。:)

5
打破parallel.foreach?
如何突破parallel.for循环? 我有一个非常复杂的语句,如下所示: Parallel.ForEach<ColorIndexHolder>(ColorIndex.AsEnumerable(), new Action<ColorIndexHolder>((ColorIndexHolder Element) => { if (Element.StartIndex <= I && Element.StartIndex + Element.Length >= I) { Found = true; break; } })); 使用并行类,到目前为止,我可以优化此过程。然而; 我不知道如何打破并行循环?该break;语句引发以下语法错误: 没有封闭循环可以中断或继续

7
lock语句的价格是多少?
我一直在尝试多线程和并行处理,并且我需要一个计数器来对处理速度进行一些基本的计数和统计分析。为了避免并发使用类的问题,我在类中的私有变量上使用了lock语句: private object mutex = new object(); public void Count(int amount) { lock(mutex) { done += amount; } } 但是我想知道...锁定变量有多昂贵?对性能的负面影响是什么?

5
Scala演员:接收与反应
首先让我说我有很多Java经验,但是直到最近才对函数式语言感兴趣。最近,我开始研究Scala,这似乎是一种非常不错的语言。 但是,我一直在Scala编程中阅读有关Scala的Actor框架的信息,有一件事我不理解。在30.4章中说,使用react代替receive可以重新使用线程,这对性能有好处,因为在JVM中线程很昂贵。 这是否意味着,只要我记得打电话react而不是receive,我就可以启动任意数量的Actor?在发现Scala之前,我一直在和Erlang一起玩,而Programming Erlang的作者自豪地介绍了20万个以上的过程而又不费吹灰之力。我讨厌用Java线程来做到这一点。与Erlang(和Java)相比,我在Scala中看到的是什么限制? 另外,该线程如何在Scala中重复使用?为了简单起见,我们假设我只有一个线程。我开始的所有参与者都将在该线程中按顺序运行,还是会进行某种任务切换?例如,如果我启动两个彼此进行乒乓球消息的演员,那么如果他们在同一线程中开始,是否会陷入僵局? 根据Scala编程的规定,编写要使用的演员比使用演员react困难receive。听起来似乎很合理,因为react没有回来。但是,本书继续说明了如何使用可以将react循环放入循环中Actor.loop。结果,您得到 loop { react { ... } } 在我看来,这与 while (true) { receive { ... } } 在本书的前面使用过。本书仍然指出,“实际上,程序至少需要几个receive”。那我在这里想念什么?除了回报之外还能receive做什么react?我为什么要在乎呢? 最后,进入我不了解的核心内容:这本书不断提到使用如何react使丢弃调用堆栈以重用线程成为可能。这是如何运作的?为什么有必要放弃调用堆栈?当函数通过抛出异常(react)终止而不能通过返回(receive)终止时,为什么不能丢弃调用堆栈呢? 我的印象是,Scala编程已经掩盖了这里的一些关键问题,这真是令人遗憾,因为否则它是一本真正优秀的书。




16
Android-防止启动时出现白屏
众所周知,许多Android应用在首次Activity聚焦之前都会非常短暂地显示白屏。在以下情况下会出现此问题: 扩展全局Application类并在其中执行主要初始化的Android应用。该Application 对象总是在第一个对象之前创建Activity(这可以在调试器中观察到),因此这很有意义。这是我的案件延误的原因。 在初始屏幕之前显示默认预览窗口的Android应用。 设置android:windowDisablePreview = "true"显然在这里不起作用。我也无法将初始屏幕的父主题设置Theme.Holo.NoActionBar为此处所述,因为[不幸的是]我的初始屏幕使用了ActionBar。 同时,未扩展Application类的应用程序在启动时不会显示白屏。 问题是,理想情况下,在Application对象中执行的初始化需要在显示第一个对象之前进行Activity。所以我的问题是,如何在不使用Application对象的情况下在应用启动时执行这些初始化?我想可能使用Thread或Service? 这是一个有趣的问题。我无法以通常的方式绕过它(通过设置NoActionBar主题),因为可悲的是我的启动画面实际上ActionBar由于某种不相关的原因而出现故障。 注意: 我已经提到以下问题: 如何在应用启动时修复白屏? Android初始画面是白色的吗? 闪屏前的白屏 Android应用启动时为白色背景 为什么开始在Android中运行应用程序时出现白屏1秒钟? 参考文献: 模式–启动屏幕。 品牌启动画面:Android的新功能。 正确的飞溅屏幕。

5
决定子进程,多处理和Python中的线程?
我想并行化我的Python程序,以便它可以在运行它的机器上使用多个处理器。我的并行化非常简单,因为程序的所有并行“线程”都是独立的,并将其输出写入单独的文件。我不需要线程交换信息,但是必须知道线程何时完成,因为管道的某些步骤取决于它们的输出。 可移植性很重要,因为我希望它可以在Mac,Linux和Windows上的任何Python版本上运行。考虑到这些限制,哪个是实现此功能的最合适的Python模块?我试图在线程,子进程和多处理之间做出选择,它们似乎都提供了相关的功能。 有什么想法吗?我想要最简单的便携式解决方案。



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.