有什么错误的想法使人们无法使用线程?[关闭]


12

是的,在程序中实现线程很难,但是为什么有些人甚至在有明显需求的情况下也不会实现它们。

一个例子:程序必须从数据库加载数据集,要做的是建立连接并在工作线程中从数据库中获取数据,然后将其加载到GUI中,从而使GUI线程对用户保持响应。

但是,不,我与那些似乎认为线程既有弊又有弊的人进行了交谈,应该不惜一切代价避免使用它们。我什至听说有些班主任建议不要使用线程,因此不想覆盖线程的使用。什么???

随着硬件进入多核,我认为我们需要更好地了解线程,而不要害怕使用它们。我个人觉得这是一个有趣的话题。

那么,您听说过关于线程的哪些错误消息?


不合适和成绩不佳者无法处理线程。真正的问题是:您将如何处理?
2012年

3
这些不是错误的想法,但应始终避免使用线程。做你的架构正确,这样的线程支持也已经得到妥善处理,每一个程序员不需要自己做。一旦程序员学会了在每种情况下添加线程,您都会遇到很大的问题。
tp1 2012年

让我再问您一个问题。您是否问过自己,是否有其他方法可以利用并行处理功能?或者,您是因为某些白皮书说过而直接进入线程,还是因为更好的程序员似乎认为这很酷?就个人而言,我喜欢轻量级进程比线程更好地相互传递消息的想法。我是懒惰/愚蠢/急忙吗?是的,我们所有人在不同程度上也是如此。
user1172763 2014年

Answers:


19

穿线很难

当然。有可能。但是,人们很难理解这个主意,以至于不必理会

并非不可能。


2
我支持这个答案。人们认为这很难。但是,并不是当您花费足够的时间来理解时。

11
@Pierre,我希望很多人对“困难” 的定义 “您必须花费足够的时间来理解”。
Benjol 2010年

1
使用TPL和await/ async关键字,线程变得越来越容易:)
Rachel

@Pierre 303:当您花足够的时间来理解它仍然很困难时,事实上,最了解它的人最有可能尽可能地避免使用它。
Michael Borgwardt

9

不是很难的线程部分,而是同步的需要以及使用线程所带来的其他所有问题。在您的GUI示例中,如何告诉主线程可以访问数据集?您是否传递了大量的回调?您是否在整个代码中分散了一堆检查变量?在某些GUI模型中,例如Silverlight,有一种称为线程亲和力的东西,这意味着您无法从其他线程访问位于主线程上的GUI元素,因此您必须避免让主线程知道某些信息是准备进一步处理。

我还没有真正听到关于线程的任何虚假信息。当您使用的任何算法本质上不是并行的时,我已经阅读了很多有关同步是一个bit子的情况案例研究。


自我注意:编写并行算法 ...谢谢。
Droogans 2011年

消息队列(与MFC中相同)。但是,即使是可燃的违法行为,也要让程序员不要破坏消息队列(通过直接共享内存中的数据)似乎失败了。
rwong 2012年

3

线程解决了您所有的问题

如果您遇到性能问题,您应该不会直接跳到线程。

线程是轻量级的

线程在二十到二十年代都是轻量级的。生成数千个线程不是。

线程很容易[Java]

创建线程很容易,但这并不意味着您会从中受益。


仅作记录,Mac OS不允许您(默认安装)创建超过512个线程。
zneak 2010年

1
那真的取决于您的语言。即使在较旧的笔记本电脑上,在Erlang中产生100万个线程也几乎没有引起注意,更不用说现代服务器了。实际上,这些甚至不仅仅是线程,它们是成熟的进程,即比线程得多。除了它们自己的程序计数器和调用堆栈(这几乎是线程拥有的唯一东西)之外,它们还具有自己的堆,甚至自己的垃圾收集器。
约尔格W¯¯米塔格

4
@JörgW Mittag:我对您的评论感到困惑。erlang如何改变操作系统创建线程或进程的方式?
史蒂文·埃弗斯

1
@SnOrfus:Erlang不使用OS线程。目前主要有三种Erlang实现:BEAM,HiPE和Erjang。BEAM和HiPE是本机实现(甚至可以在没有任何OS的情况下运行)并实现自己的流程。Erjang在JVM上运行,并使用功能强大的Kilim库实现了进程。
约尔格W¯¯米塔格

@JörgW Mittag:考虑到我的问题programmers.stackexchange.com/questions/28453/…,我觉得这很有趣。谢谢。
史蒂文·埃弗斯

1

最终,您将失去从线程中获得的任何收益,因为要修复由于使用某些不是线程安全的库/函数(您所不知道的)而引起的疯狂错误,将需要过多的同步。

如果您使用线程,那么当您不使用线程时,遇到错误的可能性将大大提高。


无法修复的错误?我从来没见过那些之前..之一
adamk

您真的从未见过无法修复的错误吗?在时间和可用的工资?
卡米尔·索佐特

如果您从未遇到无法修复的错误,那么您从事该行业的时间还不够长。在我12年以上的工作中,我看过的每个项目都至少有一个漏洞,没有人修复过,也没有人知道如何修复甚至复制。这包括我已被雇用从事的代码以及我有权阅读的代码(开放源代码)。唯一没有错误的软件是少于2或3页的软件。但是,将所有代码都设为1或2页,并不能完全解决任何问题,因为这会导致集成错误。
slebetman 2014年

1

明智地总结为什么难以使用线程的原因:-
正确的事情1)需要同步,并且需要仔细地进行锁定内容和锁定
时间的设计决策2)无法控制运行时流程
3)调试困难
4)(很少)时代)平台兼容性:-确实存在图书馆要对此进行照顾

错误的事情:
-1)线程安全和可重入函数的概念令人困惑
2)线程在纸上看起来不错,但很难实现


这些是对还是错?OP询问了哪些正确的事情,使人们无法进行多线程编程。
史蒂文·埃弗斯

实际上,您不需要锁或同步。还有消息传递模型(例如erlang,scala)和STM模型(例如clojure)。除此之外,还有不需要锁的线程安全数据结构(java中的ConcurrentHashMap)和不需要锁的原子原语。
凯文(Kevin)

1

如果您不想为代码编写测试,则不要使用线程。

线程不适用于不了解OS和计算机体系结构基础知识的典型“复制和粘贴”程序员。由于90%的程序员只熟悉Java,因此这些人实际上不是应该使用线程的人。Java使线程“容易”,但是我看到很多程序员认为,如果他们使用同步结构,它们的代码将在线程中工作。

话虽如此,每个人都需要从某个地方开始,只是不要让您的第一个线程项目升级您公司的生产后端服务器。


您可以推荐一些有关如何正确执行线程的资源吗?
乔纳森(Jonathan)

我确定这已解决。尝试从这里开始stackoverflow.com/questions/660621/threading-best-practices
cmcginty 2012年

这样做的问题是,即使您具有100%的测试覆盖率,也无法知道您的测试是否将覆盖指令与共享资源的交错方式所涉及的所有可能问题。另一方面,采用无共享架构,这变得容易得多。
Zachary K

1

一个例子:程序必须从数据库加载数据集,要做的是建立连接并在工作线程中从数据库中获取数据,然后将其加载到GUI中,从而使GUI线程对用户保持响应。

我看不到这种情况代表使用线程的必要性至少有四个原因:

  1. 数据检索应该非常快。

  2. 在许多行业应用程序中,用户在等待结果的1秒钟或2秒钟内与该应用程序无关。同样,用户将必须等到数据以任何方式返回以完成所需任务。另一方面,查询可以进行智能编码,以便一次只能检索到一整页的信息,而其他优化技术也可以帮助缩短响应时间。

  3. 在基于Web的界面中,可以使有关线程模型的链接处于活动状态。

  4. 正如您所承认的那样,线程化增加了复杂性,一些底层的开发人员可能无法添加功能或调试复杂的代码。

我的观点是:在必须使用线程时,因为软件可维护性和可靠性对组织而言比代码优雅更有价值。


1
您的第一点使我想起了分布式计算的谬论( en.wikipedia.org/wiki/Fallacies_of_Distributed_Computing)。当大量用户不得不从点2等待1或2秒以上才能使界面无响应时,很多用户可能会开始四处点击,这会使情况变得更糟。
确保

@Secure,该链接很有趣,感谢您的共享。我不确定在这个时代,我们是否能一直吸引用户的注意力始终集中在界面甚至整个工作上。我同意您的看法,在电子商务网站中,您根本不希望用户离开。
NoChance 2012年

我不是在说重点。当用户单击按钮时,由于查询数据库而界面冻结,而没有任何视觉响应,表明已完成某件事,因此某些用户尝试再次单击按钮。然后再次。然后尝试单击其他按钮或选项。我见过这样做的管理员应该更了解。
确保

第一次绘制结果屏幕时却更糟,但显示为空白。不了解大多数最新版本,但是旧版Outlook中的搜索结果就是一个很好的例子。当开始搜索时,它会显示“结果集为空”或类似的内容,并带有较大的搜索基数秒钟,并显示找到的第一个结果。如果您太急躁或急忙,您已经切换到下一个文件夹,并认为那里什么都没有。
确保

1
@安全,我明白你的意思。您在此处描述的内容很好地说明了用户界面不一致的情况。当您搜索文件时,您描述的内容也会发生。但是,除了告诉用户搜索已经开始之外,答案是什么?
NoChance 2012年
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.