Questions tagged «multithreading»

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

6
为什么xUnit框架不允许测试并行运行?
您是否知道任何可以并行运行测试以利用当今计算机中的多个内核的xUnit框架? 如果没有(或很少)这样做,也许是有原因的……测试通常这么快,以至于人们根本不认为需要将它们并行化吗? 是否有更深层次的东西可以排除(至少部分)测试分布在多个线程上?

4
将线程/后台工作者放在一类中是“错误的” /错误的设计吗?
我有一个可以从Excel中读取的类(C#和.Net 4),在该类中,我有一个后台工作程序,该工作程序将从Excel加载数据,同时UI可以保持响应。我的问题如下:在班级中有一名后台工作人员是不好的设计吗?我是否应该在没有该类的情况下创建我的课程,并使用后台工作者对该课程进行操作?我看不到以这种方式创建课程的任何问题,但是我还是新手,所以我认为在继续之前必须确定。 我希望这个问题在这里有意义,因为我认为在我的代码正常工作时,它不应该出现在stackoverflow上,这只是一个设计问题。

1
如何知道我是否过度使用了多线程?
目前,我感觉我过度使用了多线程。 我有3种数据,A,B和C。 每个A都可以转换为多个B,每个B都可以转换为多个C。 我只对Cs有兴趣。 我可以使用几个转换函数轻松地编写此代码。但我回过神来与线程执行它,三个队列(queue_a,queue_b和queue_c)。有两个线程进行不同的转换,一个工作线程: ConverterA读取queue_a和写入queue_b ConverterB读取queue_b和写入queue_c Worker 处理来自 queue_c 转换相当平凡,我不知道这个模型是否太复杂了。但这对我来说似乎非常强大。每个“转换器”甚至可以在数据到达队列之前就开始工作,并且在代码中的任何时候我都可以“提交”新的As或Bs,它将触发转换管道,这反过来又将触发工作人员的工作。线。 甚至生成的代码看起来也更简单。但是我仍然不确定我是否在为简单的事情滥用线程。

2
休眠线程如何工作?
当您休眠线程时,实际上是什么情况? 我看到休眠线程“在给定的时间段内暂停了当前线程”。但是,它是如何工作的呢? 根据Thread.sleep()在内部如何工作以及Thread.sleep如何真正工作?: 睡眠时间将取决于某些系统特定的粒度 睡眠受阻 线程离开CPU并停止执行 线程在睡眠时不占用CPU时间 我只是不太了解这一切意味着什么的内部和基本机制。 我知道有一个称为调度程序的东西负责线程之间的切换。 消息来源似乎表明这随操作系统(或硬件?)而变化,并且大多数线程被赋予1ms-60ms左右的时间,以便在CPU切换到另一个线程之前执行某些操作。 但是,当线程休眠时(例如,数秒),它如何恢复?我猜想其中涉及一个计时器,它是主板的时钟吗?它与CPU时钟速率有关吗? 即使涉及计时器,CPU如何知道何时该再次关注该线程?是否不必经常检查线程以查看其是否准备就绪?这不是有效的轮询,因此会浪费CPU时间吗? 是在休眠特定于线程语言的线程,还是由操作系统负责,还是CPU特定的事物? 有人可以通过诸如调度程序之类的基本解释以及CPU在所有这些过程中的作用向我解释一下吗?


1
最佳实践是不轮询...但是当线程调用wait()时,轮询是否不会在内部进行?
假设我们有一些线程想要检查另一个线程何时完成其任务。我已经读到我们应该调用一个wait()类型的函数,该函数将使该线程等待,直到它收到另一个线程完成的通知。这样做很好,因为这意味着我们不会执行昂贵的轮询。 但是反正不是在内部进行较低级别的轮询吗?也就是说,如果我们使线程wait()是内核不执行轮询来检查另一个线程何时完成,以便它可以随后通知第一个线程? 我想我在这里错过了什么,有人可以启发我吗?

2
如何在多核处理器上编程线程分配?
我想试验多核处理器上的线程,例如创建一个程序,该程序使用由两个不同处理器内核执行的两个不同线程。 但是,我不清楚线程在哪个级别分配给不同的内核。我可以想象以下情形(取决于操作系统和编程语言的实现): 线程分配由操作系统管理。线程是使用OS系统调用创建的,如果进程恰巧在多核处理器上运行,则OS会自动尝试在不同的内核上分配/调度不同的线程。 线程分配由编程语言实现管理。将线程分配给不同的内核需要特殊的系统调用,但是当我使用该语言的标准线程实现时,编程语言标准线程库会自动处理该问题。 线程分配必须明确编程。在我的程序中,我必须编写明确的代码来检测有多少个内核可用,并使用例如库函数将不同的线程分配给不同的内核。 为了使问题更具体,假设我已经在Windows或Linux上用Java或C ++编写了多线程应用程序。在多核处理器上运行时,我的应用程序会神奇地看到并使用多个内核吗(因为所有内容都由操作系统或标准线程库管理),还是我必须修改代码以了解多个内核?

2
我对演员模型的描述正确吗?
据我了解,参与者模型就像对象模型一样,但是有一些区别: 每个对象都产生它自己的单独线程,即使有成千上万个对象,也不是问题。 参与者不是通过调用函数和获取返回值来进行交互,而是通过发送和接收消息来进行交互。 如果您不违反该模型,则您的应用将充分利用并发功能,而不会出现竞争状况的风险。 在OO中可以执行的所有操作都可以使用actor来完成,但更好的是,问题在于最近几年我们编写的所有内容都是基于OO的-但即将进行过渡。 因此,举例来说,假设我必须定义3d向量类/角色,创建两个实例,并对它们调用求和运算。 面向对象: class V3d { constructor V3d(x,y,z) //bla float x,y,z; function sum(V3d b) { return V3d(x+b.x,y+b.y,z+b.z); } } //using: mySum = V3d(1,2,3).sum(V3d(3,2,1)) //creates 2 instances, sum, returns instantly drawPoint(mySum) //uses the result 演员模型: actor V3d { constructor V3d(x,y,z) //bla float x,y,z; loop { receive 'sum',b:V3d …

7
什么构成了在编程中正确使用线程?
我厌烦听到人们建议您每个处理器仅使用一个线程,而许多程序每个进程最多使用100个线程!以一些常见程序为例 vb.net ide uses about 25 thread when not debugging System uses about 100 chrome uses about 19 Avira uses more than about 50 每当我发布与线程相关的问题时,几乎每次都会提醒我,每个处理器不应使用一个以上的线程,并且上面提到的所有程序在使用单个处理器的系统上都会崩溃。

7
谁能建议我写一个项目来帮助我理解线程
我目前是一位C#开发人员,对线程的理解很不稳定。 这两个链接已在其他帖子中建议: http://www.yoda.arachsys.com/csharp/threads/ http://www.albahari.com/threading/ 我是否应该回到基础知识,也许再看一些有关该主题的计算机科学教材? 我真的觉得,如果我跳入并使用c#库,我将不会真正拥有扎实的知识基础。我想我需要像com cici学生一样从头开始学习这个主题,然后使用C#库。 谁能建议一种学习线程的方法,也许一些链接和/或项目构想? 提前致谢! 编辑,感谢所有答复。有人提到一本书可能是一个好主意,有人可以建议吗?我更喜欢不可知的语言。有谁知道计算机科学学位将涵盖哪些课程?我正在尝试Google搜索一些免费的在线笔记和作业。


2
JRE库中的类是否支持对外部/非JRE程序集的可观察和/或异步读取?
如何实现我的跨平台库(例如在JRE上)以对对象引用以线程安全的方式进行操作,以便其他平台上的本机前端可以观察对象并利用Observable模式? 有一点背景-大多数前端框架中都使用了数据绑定的概念。在C#和Java中,这与Observable特性有关,该特性使类能够在发生更改时触发事件,多个控件或“观察者”可以订阅该事件。这样,观察者就不必继续轮询/读取资源,进行更新比较。 我想研究一个分析引擎,该引擎会随着时间的推移对数据列表进行更改。能够让前端在分析运行时能够观察这些列表将是很好的。在我看来,这将要求前端能够将对象传递给分析引擎,并在希望跨平台的库中编写该对象,并且能够对该对象进行线程安全读取。否则,让图书馆满足可观察性合同。 在较旧的Unix风格的CLI引擎中处理此问题的方法是使用stdin / stdout / stderr,并使引擎定期更新更新。这需要标准的开销和文本解析,如果可能的话,我宁愿避免。

7
有什么错误的想法使人们无法使用线程?[关闭]
按照目前的情况,这个问题并不适合我们的问答形式。我们希望答案得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 8年前关闭。 是的,在程序中实现线程很难,但是为什么有些人甚至在有明显需求的情况下也不会实现它们。 一个例子:程序必须从数据库加载数据集,要做的是建立连接并在工作线程中从数据库中获取数据,然后将其加载到GUI中,从而使GUI线程对用户保持响应。 但是,不,我与那些似乎认为线程既有弊又有弊的人进行了交谈,应该不惜一切代价避免使用它们。我什至听说有些班主任建议不要使用线程,因此不想覆盖线程的使用。什么??? 随着硬件进入多核,我认为我们需要更好地了解线程,而不要害怕使用它们。我个人觉得这是一个有趣的话题。 那么,您听说过关于线程的哪些错误消息?

5
如何防止两个用户同时使用相同的用户名注册?
我们无法序列化注册,因为有数百万人同时注册。需要并行注册。 假设数据库不包含用户名“ user1”。当两个用户尝试同时使用“ user1”注册时,它将接受它。但是以后会引起问题。这不应该发生。 我正在寻找一个合理的解决方案。没有什么特别的。解决这个问题的一个想法。


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.