Questions tagged «multithreading»

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

19
您如何向一个7岁的孩子解释多线程处理?
已锁定。该问题及其答案被锁定,因为该问题是题外话,但具有历史意义。它目前不接受新的答案或互动。 如果您必须向一个7岁的孩子解释多线程的概念,您将如何做?我最近在一次采访中遇到了这个问题。我想出了一个使用工作(要完成的任务)和工作人员(线程)的故事,但这并不完全令人信服(认为孩子还太小)。 如果要求您描述这一点,您将如何做?

4
为什么协程又回来了?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 2年前关闭。 协程的大部分基础工作都发生在60年代/​​ 70年代,然后停下来,取而代之的是其他选择(例如线程) 对以Python和其他语言出现的协程产生新兴趣的实质是什么?

2
为什么共享状态会降低性能?
我一直在并发编程的“不分担”原则下工作。本质上,我的所有工作线程都具有相同状态的不可变只读副本,它们之间从未共享(即使通过引用)。总体而言,这确实很好。 现在,有人引入了一个无锁单例缓存(例如静态字典),所有线程正在同时访问。由于字典在启动后永远不会更改,因此没有锁。没有任何线程安全问题,但是现在性能下降了。 问题是...由于没有锁,为什么引入此单例会导致性能下降?幕后到底发生了什么,可以解释这一点? 确认一下,唯一的改变就是访问这个新的单例,我只需注释掉对缓存的调用就可以可靠地重新创建它。


4
声称自己不“多核”友好的程序
您会时不时看到这个短语或类似词,通常指的是声称它们并非旨在充分利用多核处理器的程序。这在视频游戏编程中尤其常见。(当然,许多程序没有并发并且不需要它,例如基本脚本等)。 怎么会这样?许多程序(尤其是游戏)固有地使用并发性,并且由于OS负责CPU上的任务调度,那么这些程序是否固有地没有利用可用的多个内核?在这种情况下,“利用多核”意味着什么?这些开发人员实际上是在禁止OS任务调度并强制进行亲和力还是自己进行调度?(听起来像是主要的稳定性问题)。 我是Java程序员,所以也许由于抽象或其他原因我不必处理这个问题。

4
非功能语言中持久数据结构的使用
纯粹的功能或近乎纯功能的语言会从持久性数据结构中受益,因为它们是不可变的,并且非常适合无状态编程功能。 但是,我们不时看到用于Java等(基于状态的OOP)语言的持久数据结构库。人们经常听到有人主张使用持久性数据结构,因为它们是不可变的,因此是线程安全的。 但是,持久性数据结构是线程安全的,原因是,如果一个线程将一个元素“添加”到持久性集合中,则该操作将返回一个新集合,就像原始集合一样,但是添加了元素。因此,其他线程将看到原始集合。当然,这两个集合共享许多内部状态-这就是为什么这些持久性结构有效的原因。 但是,由于不同的线程看到的数据不同的状态,它似乎是持久数据结构是不是本身足以处理的情况,其中一个线程进行更改,对于其它线程是可见的。为此,似乎我们必须使用诸如原子,引用,软件事务性存储器乃至经典锁和同步机制之类的设备。 那么为什么PDS的不变性被吹捧为有利于“线程安全”的东西呢?在PDS协助同步或解决并发问题方面,有没有真实的例子?还是PDS只是一种为对象提供无状态接口以支持功能编程风格的方式?

3
BackgroundWorker与异步/等待
我是C#开发的新手,希望创建一个响应更快的UI。在我的初步研究中,我看到了两种实现此目的的方法: 与BackgroundWorker类结合使用多线程。 较新的异步/等待修饰符。 更新意味着更好吗?两种方法有什么区别?如果我想创建一个新项目,如何选择哪种方法? 编辑:也许我应该指定。我正在创建一个Windows Forms应用程序,其中所有必需的数据都将保存/加载到本地磁盘上。我还将与多个USB设备通信。

2
如何使通用结构更有效率?
“通用构造”是顺序对象的包装器类,可使它线性化(并发对象的强一致性条件)。例如,这是来自Java [1]的一种经过修改的免等待构造,它假定存在一个满足接口的等待空闲队列WFQ(仅需要线程之间的一次性共识)并假定一个Sequential接口: public interface WFQ<T> // "FIFO" iteration { int enqueue(T t); // returns the sequence number of t Iterable<T> iterateUntil(int max); // iterates until sequence max } public interface Sequential { // Apply an invocation (method + arguments) // and get a response (return value + state) Response apply(Invocation …

3
专用线程锁定对象的命名约定
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引文回答。 4年前关闭。 这是一个相对较小的问题,但我无法找到官方文档,甚至找不到关于它的博客意见/讨论。 简而言之:当我有一个私有对象,其唯一目的是为私有服务时lock,该对象该如何命名? class MyClass { private object LockingObject = new object(); void DoSomething() { lock(LockingObject) { //do something } } } 我们LockingObject在这里应该命名什么?还不仅要考虑变量的名称,还要考虑变量在锁定时的代码外观。 我看过各种示例,但似乎没有可靠的建议: SyncRoot(和的各种变体形式_syncRoot)的用法很多。 代码示例: lock(SyncRoot),lock(_syncRoot) 这似乎受到VB的等效SyncLock语句,SyncRoot某些ICollection类上存在的属性以及某种SyncRoot设计模式的一部分的影响(这可能是一个坏主意) 在C#上下文中,不确定是否要使用VBish命名。更糟糕的是,在VB中将变量命名为与关键字相同。不知道这是否会引起混乱。 thisLock并lockThis来自MSDN文章:C#lock语句,VB SyncLock语句 代码示例: lock(thisLock),lock(lockThis) 不知道这些名称是否仅出于示例目的而最少命名 如果我们在static类/方法中使用它,那有点奇怪。 编辑:关于锁的Wikipedia文章也使用此命名作为其示例 PadLock(不同大小写的)的几种用法 代码示例: lock(PadLock),lock(padlock) 不错,但是我唯一的牛肉就是它毫无意外地调用了物理 “挂锁” 的图像,而我倾向于将其与抽象线程概念无关。 根据锁定意图命名锁定 代码示例: lock(messagesLock),lock(DictionaryLock),lock(commandQueueLock) 在VB SyncRoot MSDN页面示例中,它包含一个simpleMessageList带有私有messagesLock对象的示例 …

5
学习并发和多线程应用程序的最佳资源是什么?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 4年前关闭。 已锁定。这个问题目前不接受新的答案或互动。了解更多。 我意识到我在多线程应用程序和并发编程方面存在巨大的知识鸿沟。过去,我已经介绍了一些基础知识,但是大部分内容似乎都已遗忘,这绝对是我想要且需要了解的领域。 学习构建并发应用程序的最佳资源是什么?我是一个非常务实的人,因此,如果所说的书包含一些具体的例子会更好,但是我愿意提出建议。我个人更喜欢使用伪代码或C ++,并且最好还是偏向游戏开发,但不是必需的。

3
C#5异步支持将如何帮助解决UI线程同步问题?
我在某处听说C#5 async-await非常棒,您不必担心这样做: if (InvokeRequired) { BeginInvoke(...); return; } // do your stuff here 看起来,等待操作的回调将在调用者的原始线程中发生。埃里克·利珀特(Eric Lippert)和安德斯·海斯伯格(Anders Hejlsberg)多次指出,此功能源于使UI(尤其是触摸设备UI)具有更高响应能力的需求。 我认为此类功能的常见用法如下: public class Form1 : Form { // ... async void GetFurtherInfo() { var temperature = await GetCurrentTemperatureAsync(); label1.Text = temperature; } } 如果仅使用回调,则设置标签文本将引发异常,因为未在UI线程中执行该文本。 到目前为止,我找不到任何资源可以证实这种情况。有人知道吗?是否有任何文件从技术上解释这将如何工作? 请提供可靠来源的链接,而不仅仅是回答“是”。

6
C#5异步重入的解决方案
因此,关于C#5中新的异步支持的问题一直困扰着我: 用户按下一个按钮即可启动异步操作。呼叫立即返回,并且消息泵再次开始运行-这就是重点。 因此,用户可以再次按下按钮-导致重新进入。如果有问题怎么办? 在我看到的演示中,他们在await通话前禁用了按钮,然后在通话后再次启用了该按钮。在我看来,这似乎是现实应用中非常脆弱的解决方案。 我们是否应该编写某种状态机来指定必须为给定的一组运行操作禁用哪些控件?或者,还有更好的方法? 我很想在操作过程中只显示一个模式对话框,但这有点像使用大锤。 有人有什么好主意吗? 编辑: 我认为禁用在操作运行时不应该使用的控件是脆弱的,因为我认为当您拥有带有许多控件的窗口时,它很快就会变得很复杂。我喜欢使事情简单,因为在初始编码和后续维护期间,它减少了错误的机会。 如果存在针对特定操作应禁用的控件集合,该怎么办?如果同时执行多个操作怎么办?

2
编译器是否利用多线程来加快编译时间?
如果我正确地记住了我的编译器课程,那么典型的编译器将具有以下简化的轮廓: 词法分析器逐字符扫描(或调用某些扫描功能)源代码 根据词素词典检查输入字符的字符串是否有效 如果lexeme有效,则将其分类为与其对应的令牌 解析器验证令牌组合的语法;逐个令牌。 从理论上讲,将源代码分成四分之一(或其他分母)并在扫描和解析过程中使用多线程是否可行?是否存在利用多线程的编译器?

5
多个CPU /内核可以同时访问同一RAM吗?
我猜这是会发生的: 如果两个内核试图访问RAM中的相同地址,则一个内核必须等待另一个内核访问RAM。在第二时间,每个核心将尝试访问相同的地址,他们仍然可能有RAM缓存,这样他们就可以访问各自的同时缓存。 如果两个内核试图访问同一RAM中的不同地址,则一个内核必须等待另一个内核访问RAM。 换句话说,我想对于RAM密集型编程任务来说,多处理将无济于事,除非它涉及每个内核多次从RAM中的同一地址读取数据。 那么,多个CPU /内核可以同时访问同一个RAM,还是我所说的正确?

3
并行性意味着并发,但不是相反吗?
我经常读到并行性和并发性是不同的东西。答题者/评论者经常会写到他们是两个完全不同的事物。但是我认为它们是相关的,但我想对此进行一些说明。 例如,如果我在多核CPU上并设法将计算分成x个较小的计算(例如使用fork / join),每个计算均在其自己的线程中运行,则我将拥有一个同时进行并行计算的程序(因为大概在任何时候,几个线程都将在多个内核上运行)并且是并发的吗? 虽然如果我只是简单地使用Java,并处理事件调度线程上的UI事件和重绘,再运行我创建的唯一线程,那么我将拥有一个并发程序(EDT + GC线程+我的主线程)等),但不是并行的。 我想知道我是否正确,并行性(在“单核但多核”系统上)是否总是暗示并发? 另外,是否在多核CPU上运行多线程程序,但是不同线程在进行完全不同的计算的情况下是否考虑使用“并行性”?

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.