2009-11-10 46 views
10

我是Stack Overflow的初学者。 我正在C/C++的Unix平台上工作。 了解这些方面的基本编程我怎么能从multithreading开始?如何开始使用多线程编程?

多线程似乎是非常有趣,我想成长我的知识在这方面。

我怎么能开始使用多线程,什么是最好的技术/书/电子书/可尽早抢概念的文章?

+1

下面的答案很好。我担心你会得到很多“使用这个API,这是zeh beeeeeeeeessst !!”但最重要的一点是我会在这里重申:使用的API是无关紧要的。无论API如何,大多数概念都适用。阅读下面列出的一些资源。选择一个你认为可以平行的问题,然后尝试。 – 2009-11-10 12:53:46

+1

无论你做什么,从**高级** API开始。在您详细了解它如何工作之前,请先学习如何做正确的事情。 – 2009-11-10 13:15:23

+0

@static_rtti到了什么地步?理解死锁和互斥的基础是不可避免的。一旦低级别API进入监视器范围,一些较低级别的API会促进这种理解,而不是更高级别的API。我建议你先从对你最有意义的那个开始,而不是担心它是高还是低。另外,还会有人反对你说,除非你知道细节,否则你不知道该怎么做。您的评论在任何方面都没有真正的帮助。 – 2009-11-10 17:48:32

回答

1

我认为,维基百科的文章Multithreading给你一个快速概述,并追随外部链接,你会得到的话题的一个很好的概述。 之后 - 或另外 - 你可以读Tanenbaum的Operating Systems: Design and Implementation(顺便说一下,这本书很棒)。 但最重要的是 - 在我看来 - 让你的手。所以,只需下载一个示例应用程序...例如The Code Project或任何可以找到并随身携带的网站。如果你使用锁,看看应用程序有多不同,或者如果两个线程试图访问相同的资源,以及发生这种情况的频率等等,会发生什么情况。等等。 因此,我认为你会很快得到它的窍门。评估和玩弄对自己新手的技术是很有趣的。

6

学习多线程编程有两个部分:

  1. 如何编写多线程应用程序
  2. 如何利用现有的API(并行线程)

学习多线程编程更难, thre在Linux Journal发表的一篇好文章将帮助你理解基本原理。

为了更好地理解并行线程我建议阅读本教程 - POSIX Threads Programming

还有一本好书,通过O'rielly称为PThreads Programming

+0

我同意O'Rielly的书......虽然我最终使用框架来帮助C++中的一些细节,但我真的通过阅读它来澄清我对多线程编程的理解。 – 2009-11-10 17:46:40

0

也许有点争议,但真正的多线程对cklicked我,当我试图解决一次编码难题。

的拼图玩具是如何编写线程安全的代码,而无需使用互斥。我的第一次尝试是悲惨的,但是当我最终得到它时,就像学骑自行车一样 - 我从来没有对并发性感到不确定。

有些时候,我甚至在谁已经就这一课题看书程序员跌跌撞撞,但无法理解像一个事实,即原始的分配有时可能不是一个原子操作简单的事情。

+0

“原语赋值有时可能不是原子操作。” 许多人不知道赋值可能不会按照代码中所写的顺序执行,并且事实上可能会被编译器重新排序,从而导致并发症。我喜欢Herb Sutter,Scott Meyers&Andrei Alexandrescu在这方面的启发性文章。 – Modicom 2009-11-10 12:36:14

+0

难题的解决方案是无锁设计,还是使用除互斥锁(AKA dijkstra)以外的锁定机制(如Dekker算法)?如果它是无锁解决方案,您是否介意以某种方式发布问题和解决方案? – 2009-11-10 16:16:08

+0

@San Jancinto:我其实不记得这个谜题的细节。我也很遗憾没有保存它,这是大约8 - 9年前,它所发布的论坛不存在了。 – sharkin 2009-11-10 16:38:21

0

一切都取决于你的目标。有很多基于POSIX线程框架解决常见多线程问题的代码和文章(我在这里看到好文章的推荐数量)。主要问题是你想要建立什么。对于某些任务,建议不要使用多线程。

这是一本书“Foundations of Multithreaded, Parallel, and Distributed Programming”这是与讨论的主题相关,我想推荐。它最重要的优点是“相对容易阅读”的风格,但与POSIX线程的意识形态(这是常见问题)没有硬联系。

2

如果你开始使用多线程,我的建议是先查看并更好地了解您的系统上的I/O。了解阻塞与非阻塞I/O,信令,异步例程,回调等等。如果不是将多线程添加到程序的主要原因,那么I/O可能就是其中之一。有了这些知识,您就可以在pthread或java线程上拿起一本书,或者围绕Boost线程库或另一个线程库绕过您最喜爱的技术。

0

因为它是UNIX为什么不从IPC和进程开始?即消息队列,共享内存和互斥锁。

0

研究各种库框架和操作系统设施是理解低级并发的好方法。您在那里找到的示例可以让您开始在短时间内编写并发代码。

在通过几个死锁和共享内存损坏问题调试您的方式后,您会发现需要一些工具来推理和分解并发问题。我个人喜欢Herb Sutter的The Pillars of Concurrency文章作为出发点。这个想法是为了更好地理解你为什么需要并发。您是否在寻找改进的响应时间,并行计算以及一些原因的组合?

了解“为什么”会让你更好的“什么”。从那里你可以总是蜘蛛出到不同的低级方法:Active Objects,monitor objectsmessage passingetc。如你所说,在这个领域有很多知识。