Questions tagged «multithreading»

与多线程相关的问题,包括技术,结构和安全性问题。

3
为什么用GIL编写Python?
全局解释器锁(GIL)似乎经常被引用为Python中线程之类的操作比较棘手的主要原因-这就提出了一个问题:“为什么首先要这样做?” 不是程序员,我不知道为什么会这样-放入GIL的逻辑是什么?


4
什么是线程池?
一个人如何实现线程池?我一直在Wikipedia上阅读“线程池”,但是我仍然想不出该解决该问题的方法(可能是因为我不太了解简单的线程池)。 有人可以用简单的英语解释我是什么线程池,一个人将如何回答这个问题?

3
单个线程如何在多个内核上运行?
我试图从高层次上理解单个线程如何跨多个内核运行。以下是我的最佳理解。我不认为这是正确的。 根据我对“ 超线程”的阅读,看来OS会组织所有线程的指令,使它们不会彼此等待。然后,CPU的前端通过向每个内核分配一个线程来进一步组织这些指令,并在任何打开周期之间分配来自每个线程的独立指令。 因此,如果只有一个线程,那么操作系统将不会进行任何优化。但是,CPU的前端将在每个内核之间分配独立的指令集。 根据https://stackoverflow.com/a/15936270,特定的编程语言可能会创建更多或更少的线程,但是在确定如何处理这些线程时这是无关紧要的。OS和CPU处理此问题,因此无论使用哪种编程语言,都会发生这种情况。 只是为了澄清一下,我要问的是在多个内核上运行一个线程,而不是在一个内核上运行多个线程。 我的摘要有什么问题?线程的指令在哪里以及如何划分到多个内核之间?编程语言重要吗?我知道这是一个广泛的主题;我希望对此有一个高层次的理解。

15
在当前的软件行业中,多线程有多重要?[关闭]
我有将近3年使用MVC框架(如struts)用Java编写Web应用程序的经验。尽管我已经为大型零售连锁店编写了代码,但到目前为止,我从未编写过多线程代码。 在面试过程中,我会遇到一些有关多线程的问题,我通常会回答它们(大多数是简单的问题)。这让我想知道在当前的行业场景中多线程有多重要?

1
纤维,协程和绿线之间有区别吗?
今天,我在互联网上阅读了几篇有关纤维,协程和绿色线程的文章,看来这些概念有很多共通之处,但还是存在细微的差异,尤其是当我们谈论纤维和协程时。 是否有一个简洁,正确的摘要来使它们彼此不同? 更新:我发现区分协程和纤维(N4024 C ++草案)文档特别擅长区分纤维和协程。

12
为什么程序需要特定数量的最小CPU内核?
当在内核数少于N的CPU上运行时,是否可以编写无法正常工作的代码(或完整的软件,而不是一段代码)?没有显式检查并故意失败: 如果(noOfCores <4)则没有故意运行 我正在查看游戏的最低系统要求(Dragon Age:Inquisition),它规定了至少四核CPU。许多玩家表示,它不能在两核CPU上运行,甚至不能在具有两个物理核和两个逻辑核的Intel Core i3上运行。而且这不是计算能力的问题。 据我了解,操作系统无法将线程与CPU完全隔离开来。 只是为了清除事情: 我不是在问:“我可以从代码中找出CPU内核的数量,并故意失败吗?” ...这样的代码是不正确的(迫使您购买更昂贵的CPU来运行程序-无需计算能力)。我要问的是,您的代码具有四个线程,并且当两个线程在同一物理核心上运行时会失败(而无需显式检查系统信息并有意地失败)。 简而言之,是否可以有需要多个核的软件,而又不需要来自多个核的额外计算能力?它仅需要N个单独的物理核心。

6
测试多线程竞争条件
阅读对此答案的评论,特别是: 仅仅因为您不能编写测试并不意味着它没有坏。未定义的行为通常会按预期方式起作用(C和C ++充满了),竞争条件,由于内存模型弱而可能重新排序... – CodesInChaos 7小时前 如果无法复制@CodesInChaos,则也无法测试写入“修复”的代码。在我看来,将未经测试的代码付诸实践是更糟糕的罪行– RhysW 5小时前 ...让我想知道是否有任何好的通用方法来持续触发由测试用例中的竞争条件引起的生产问题中很少发生的问题。

16
我应该照顾几乎肯定不会发生的比赛条件吗?
让我们考虑一下诸如GUI应用程序之类的应用程序,其中主线程几乎立即更新UI,而另一些线​​程正在通过网络轮询数据,或者可以保证需要5到10秒才能完成工作。 我收到了许多不同的答案,但是有些人说,如果这是统计上不可能的比赛条件,则完全不必担心,但其他人则说,即使有10 %-53%(我您不知道数字,这是我所听到的)由于比赛条件而发生的一些伏都教徒魔术,请始终在需要它的线程上获取/释放锁。 你怎么看?在这种统计上不可能的情况下处理比赛条件是否是一种良好的编程习惯?还是增加更多的代码行以降低可读性是完全没有必要,甚至会适得其反?

8
进行多线程JavaScript运行时实现的缺点是什么?[关闭]
在过去的一周中,我一直在研究多线程JavaScript运行时实现。我有一个使用JavaScriptCore和boost的C ++概念证明。 该体系结构很简单:当运行时完成对主脚本的评估后,它将启动并加入线程池,该线程池开始从共享优先级队列中选择任务,如果两个任务尝试同时访问变量,它将被标记为atomic,并且争夺访问权限。 问题是,当我向JavaScript程序员展示此设计时,我得到了非常负面的反馈,我也不知道为什么。即使是私下里,他们都说JavaScript是单线程的,必须重写现有的库,而如果我继续从事这一工作,gremlins将产生并吞噬一切生物。 我最初也有一个本地协程实现(使用boost上下文),但是我不得不放弃它(JavaScriptCore对于堆栈是很古怪的),并且我不想冒险,所以我决定不提它。 你怎么看?JavaScript是单线程的吗,应该单独使用吗?为什么每个人都反对并发JavaScript运行时的想法? 编辑:该项目现在位于GitHub上,您可以自己尝试一下,让我知道您的想法。 以下是无争用地在所有CPU内核上并行运行的承诺的图片:

19
在大型站点上服务后台任务
我们正在处理StackOverflow上一个有趣的问题。 我们有一堆小的“需要尽快完成的任务”。一个示例是更新“相关问题”列表。过去我们所做的是将这些任务附加到某些用户的页面加载中。 这从来都不是理想的,但并不是很明显。现在,SO已经超过了1,000,000个问号,那些不幸的用户开始感觉到它。 自然的解决方案是将这些任务实际推入后台。我正在考虑有两种广泛的方法可以做到这一点。 1.在IIS中作为自定义线程池/工作队列 基本上,我们启动了几个(非ThreadPool,以便不干扰IIS)线程,并使它们服务于我们将Funcs推入的某些集合。 这里的最大优点是简单性。我们不必担心会封送任何东西,也不必确保某些外部服务正常运行并做出响应。 我们还可以访问所有通用代码。 缺点是,我们不应该使用后台线程。我知道的反对意见都集中在饥饿的IIS(如果使用ThreadPool)和线程随机死亡(由于AppPool回收)的问题上。 我们已经有了现有的基础架构来使随机线程死亡成为非问题(基本上可以放弃检测任务的可能性),并且限制线程数量(并使用非ThreadPool线程)也不难。 我是否在IIS进程线程池/工作队列中缺少其他任何反对意见? 已移至StackOverflow,因为此处未真正解决。 2.作为服务 某些第三方解决方案或定制解决方案。 基本上,我们会将任务跨流程边界编组到某个服务,而不必理会它。大概我们是在某些代码中链接原始代码,或者将它们限制为原始SQL +连接字符串。 优点是这样做的“正确方法”。 缺点是我们要么只能做有限的工作,要么必须制定一些系统来使该服务与我们的代码库保持同步。我们还需要以某种方式挂钩所有监视和错误日志记录,这些都是通过“ In IIS”选项免费获得的。 服务方法还有其他好处或问题吗? 简而言之,是否存在无法预见和无法克服的问题,从而使方法1变得不可行,如果是的话,我们是否应该寻求方法2的良好第三方服务?

1
go-langs goroutine池只是绿色线程吗?
在这里评论员提供绿色线程的批评如下: 最初,我是在N:M模型上出售的,这是一种使事件驱动的程序不带回调地狱的方法。您可以编写看起来像是古老的过程代码的代码,但是在其中有一种神奇之处是,只要有东西阻塞,它就会使用用户空间任务切换。听起来不错。问题在于,我们最终要用更多的复杂性来解决复杂性。swapcontext()和family相当困难,其复杂性来自其他意外地方。 突然之间,您被迫编写了一个用户空间调度程序,并猜测编写一个调度程序确实很难做,而要使Linux的调度程序投入大量的精力,这将做得更好。现在,您希望您的日程表将N个绿色线程分配给M个物理线程,因此您不必担心同步。同步带来了性能问题,因此现在就开始您的工作吧,您将遇到一个新的无锁兔子洞。构建正确的高度并发调度程序绝非易事。 另一个批评是在这里: 伪造多个线程的单个进程存在很多问题。其中之一是,所有伪造的线程都会在任何页面错误时停止运行。 我的问题是- 是去浪的够程(用于默认池)只是绿色的线?如果是这样,他们是否解决了上述批评?

10
为什么您的代码不应使用100%CPU?[关闭]
我专门讲的是在Windows XP或更高版本上运行的C#.NET 4程序,但是一般的答案也是可以接受的。 假设一个已经优化和高效的程序。这里的问题完全归结于CPU使用率高对硬件的影响,以及是否应该限制高使用率的程序以减少磨损,而不是取决于我的实现是否有效。 今天的一位同事建议我不要在数据加载过程中实现100%CPU利用率的目标,因为“现代CPU价格便宜,并且在100%CPU时会迅速降级”。 这是真的?如果是这样,为什么?以前,我给人的印象是100%CPU使用率对于密集或长时间的操作来说是更可取的,而且我在这两种方法上都找不到任何可敬的资源。
42 c#  multithreading  cpu  usage 

5
不变性是否完全消除了多处理器编程中对锁的需求?
第1部分 显然,不变性可以最大程度地减少多处理器编程中对锁的需求,但是它消除了这种需求吗?还是存在仅不变性还不够的情况?在我看来,您只能推迟处理和封装状态,直到大多数程序必须实际执行某些操作(更新数据存储,生成报告,引发异常等)之前。这样的动作能否始终不加锁地进行?扔掉每个对象并创建一个新对象而不是更改原始对象(对不变性的粗略看法)的纯粹行动是否提供了对进程间争用的绝对保护,还是有些仍然需要锁定的情况? 我知道很多函数式程序员和数学家都喜欢谈论“无副作用”,但是在“现实世界”中,所有事情都有副作用,即使这是执行机器指令所需的时间。我对理论/学术答案和实际/现实答案都感兴趣。 如果不变性是安全的,那么在给定某些界限或假设的情况下,我想知道“安全区”的边界到底是什么。可能的边界的一些示例: 输入输出 异常/错误 与其他语言编写的程序的交互 与其他机器(物理,虚拟或理论上的机器)的交互 特别感谢@JimmaHoffa 的评论,这开始了这个问题! 第2部分 多处理器编程通常用作优化技术-使某些代码运行更快。什么时候使用锁和不可变对象更快? 考虑到阿姆达尔定律所规定的限制,与可变对象锁定相比,什么时候可以实现更好的整体性能(考虑或不考虑垃圾收集器)? 摘要 我将这两个问题合并为一个,以尝试了解边界不变性在哪里作为线程问题的解决方案。

4
在GUI编程中,调用方为什么要确保线程安全?
我已经在许多地方看到,规范知识1是调用者的责任,以确保您在更新UI组件时位于UI线程上(特别是在Java Swing中,您位于Event Dispatch Thread上) 。 为什么会这样呢?事件分发线程是MVC / MVP / MVVM中视图的关注点;在视图之外的任何地方处理它,都会在视图的实现和该视图的实现的线程模型之间建立紧密的耦合。 具体来说,假设我有一个使用Swing的MVC架构的应用程序。如果调用者负责更新事件调度线程上的组​​件,则如果我尝试将Swing View实现换成JavaFX实现,则必须更改所有Presenter / Controller代码以改为使用JavaFX Application线程。 因此,我想我有两个问题: 为什么调用者有责任确保UI组件线程安全?我上面的推理中的缺陷在哪里? 我该如何设计我的应用程序以松散耦合这些线程安全问题,但仍然是适当的线程安全? 让我添加一些MCVE Java代码来说明“调用者负责”的含义(这里还没有其他好的做法,但我试图将其尽量减少): 来电者负责: public class Presenter { private final View; void updateViewWithNewData(final Data data) { EventQueue.invokeLater(new Runnable() { public void run() { view.setData(data); } }); } } public class View { void …

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.