谁能建议我写一个项目来帮助我理解线程


13

我目前是一位C#开发人员,对线程的理解很不稳定。

这两个链接已在其他帖子中建议:

http://www.yoda.arachsys.com/csharp/threads/

http://www.albahari.com/threading/

我是否应该回到基础知识,也许再看一些有关该主题的计算机科学教材?

我真的觉得,如果我跳入并使用c#库,我将不会真正拥有扎实的知识基础。我想我需要像com cici学生一样从头开始学习这个主题,然后使用C#库。

谁能建议一种学习线程的方法,也许一些链接和/或项目构想?

提前致谢!

编辑,感谢所有答复。有人提到一本书可能是一个好主意,有人可以建议吗?我更喜欢不可知的语言。有谁知道计算机科学学位将涵盖哪些课程?我正在尝试Google搜索一些免费的在线笔记和作业。


我不知道这是否有帮助,但这是我不久前在VB.Net中编写的简单教程,它解释了线程的基本概念。您应该能够轻松地将其转换为C#。chrishaas.wordpress.com/2009/06/25/…–
克里斯·哈斯

我强烈建议编写一个多线程GUI,理由是它会限制使用线程进行处理并保持理智的局限性。但这不是建设性的,因此我将其作为评论而非回答……:-)
Donal Fellows

Answers:


3

编写多线程Web服务器。您将学习TON。而不仅仅是关于线程。


4

生产者-消费者问题是一个典型的例子,它不仅可以帮助您理解线程,而且还可以帮助您了解处理器调度(可以使用fork()来说明子进程而不是线程)和程序如何与背后的操作系统进行交互。现场。

以下是您应了解的有关线程/分支的重要内容的摘要:1.操作系统如何安排任务(例如循环算法)2.资源锁定(如果多个线程正在使用同一资源,则您不希望它们可以同时访问它们-发生的错误

这是有关此经典问题的Wiki文章:http : //en.wikipedia.org/wiki/Producer-consumer_problem

基本上,创建一个产生“消费者”线程的“生产者”。生产者生产“资源”,而消费者消费它。将其放在一个循环中,然后观察发生了什么(您会感到惊讶的是,由于不同步的方法,最终使用者将消耗更多的资源,然后可用的资源)。


有趣的是,似乎我在创建线程Windows服务时没有意识到就设置了这种模式。您的描述是完美的。很好的知道,这几乎被标记为我公开问题的答案。
托尼

2

选择经典的高度并行问题之一。您可能会发现,选择具有超线性加速功能的汽车更有趣。

考虑搜索未排序且未索引的列表。这个问题很简单。首先实现单线程搜索,然后执行朴素的并行搜索。实施偷窃工作。生成一些随机数据集,并在同一数据集上运行所有三个版本。计算加速。


0

我认为教科书不是下一个最好的步骤。一个项目是要走的路。这应该让您感到兴奋。

第一次进行线程处理时,我正在改善Web搜寻器的性能。如果不串行执行所有网络IO,则可以更快地进行爬网。首先,这是一个很棒的项目,因为您可以通过多种方法来实现它,但是它并不像多线程GUI编程那样复杂。它还不需要太多专业技能(例如,大量的计算工作)。

因此,找出一些信息来抓取并开始黑客攻击。它不需要花很长时间就能开始工作,这将是一个简短的介绍。


我同意一个项目,但是网络I / O并不是线程的好用例。与使用线程解决的相同问题相比,非阻塞I / O效率更高,使用的资源更少,竞争条件和极端情况更少。学习成为一名优秀的并行程序员的一部分是要认识到线程不是理想的。
Ben Voigt

您可能非常正确,我指的是一些非常基本的Python Web抓取,我在其中添加了大约8行代码以使其成为多线程。我怀疑将它与现有代码异步会如此容易,但是我很想知道我是否/错了。我认为学习成为一名优秀的并行程序员的一部分可能是拥有很多经验,好与坏:)
亨利

0

为一个简单的间谍与间谍应用建模。

每个间谍都在单独的线程上运行。

每个间谍可以对另一个间谍造成伤害,但不能直接造成伤害。

每个间谍可以从另一个间谍那里窃取有价值的资源,但不能直接窃取。

两名间谍只能使用有限的资源池,因此必须共享它们。一次只能监视一个间谍。


0

让我烦恼的是:布鲁斯·埃克尔(Bruce Eckel)的第4版“用Java思考”中有很长的一章是关于线程的(超过100页-几乎是一本小书)。我已经读过这本书的旧版本,因此没有读过本章。但是我记得他的一篇博客文章(或他的书的发行说明),其中他声称写这本书很辛苦,最终对他来说是真正的成就。一探究竟...

除此之外,此商业培训网站上还有2.5小时的视频课程,但是您可以免费试用(必须保留信用卡数据;因此请不要忘记退订)

http://www.pluralsight-training.net/microsoft/olt/Course/Toc.aspx?n=clr-threading


0

我是否应该回到基础知识,也许再看一些有关该主题的计算机科学教材?

这始终是一个不错的选择,我建议您拿起一本好的线程书籍,以使自己熟悉线程。我学习了Java多线程技术,并将其知识轻松转换为C#。

如果您想要一个实际的例子,那么我建议您尝试用餐哲学家的问题

进入多线程时,您需要学习一些东西:

  1. 同步的不同方式(信号量,互斥量等)
  2. 原子操作(在C#中,默认情况下不是通过原子操作通过互锁完成)。
  3. 无锁并发编程。
  4. 免等待的并发编程。
  5. 线程,线程池,BackgroundWorkers等

我目前无法想到其他事情。Albahari教程看起来非常好!


不幸的是,用餐哲学家不是一个有用的问题。本来是为了演示比赛条件,但是死锁是否真正发生取决于系统调度程序,其他任务,硬件中断的变化情况……总之,这是完全不确定的,因此我认为这不是一个好地方开始学习。
Ben Voigt

1
@Ben Voigt,我同意用餐哲学家的问题不是确定性的,但是我要说大多数线程问题也不是确定性的。当我参加并行编程课时,这是我们做的第一批练习之一,现在我并不是在说老师一定是对的,但他当然是我所拥有的最好的老师之一,并且他具有解释和教学的能力。并发性很棒。DPP仅演示一种并发问题:死锁。OP还应研究比赛条件,ABA问题等。
基里尔

@Lirik:当然,了解用餐哲学家的问题。但是我不会实现它。编写错误的代码可能会成为很难改掉的习惯。
Ben Voigt

@Ben Voigt,对不起,我必须缺少一些东西:餐饮哲学家问题的重点是编写一个不会死锁的程序,那么解决DPP怎么需要编写“错误代码”?
基里尔
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.