2009-11-10 50 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。如你所說,在這個領域有很多知識。