多線程是否有意義?

我實在是很想知道,世面上說的雙核多線程那些處理器,是不是對所有進程都有自己的多線程?如果是這樣的話,自己寫的程序,在運行的時候,多線程不會因為執行順序問題而出錯嗎?如果說有鎖的那些功能,那麼簡單的一個程序,多線程豈不是沒有任何意義?


你的問題主要在於編碼不多而想得太多。


謝邀,你這問題一下問了那麼多,不好回答,我先簡單說一下。

首先你要明白進程跟線程是不同的。你可以把線程理解為進程的小弟。有的東西可以一起用,有的不行。所以不是所有的進程都有多線程的。但是一個進程,有可能在兩個核心上跑的。這個取決於工程師怎麼設計操作系統,以及怎麼設計CPU了。對於線程的多少,程序員是可以控制的,java中就有專門的函數。但是操作系統會覺得線程是在哪一個,或多個核心上跑。

如果你不考慮互斥這類問題,不用多線程,就是多進程就一定會出現互斥的問題。這類問題又稱為臨界區問題,經典模型——五位哲學家吃通心麵問題。有很多解決辦法,最基本的就是通過信號量解決的 。這個問題最早是在多cpu平台上出現。

對於簡單的程序,多線程是否沒有意義?

的確是沒有意義的。甚至,對於複雜的程序,CPU數量的增加也是有邊際效應的。即,CPU數量達到某一時刻的時候,你再添加CPU,性能的提升就是微乎其微。很多人覺得超級計算機就是堆硬體這一點是錯的,正如蓋樓難道就只是堆磚頭?


在老手看來是個蠢問題,但是菜鳥提這個問題卻太正常了,我當年也有過類似的疑問。目前這個問題下還沒有太好的答案,我試著回答一下。

計算機程序不論做什麼事情,歸根到底可以分類為「計算任務」和「讀寫任務」。兩者使用的是計算機上的不同的資源,CPU是計算資源,硬碟、網路是讀寫資源。多個計算任務之間可能有順序依賴也可能沒有,把彼此之間沒有順序依賴的計算任務同時進行以縮短處理時間的做法叫做「並發(concurrency)」;當計算任務對讀寫任務有依賴時,不把計算資源浪費在對讀寫任務的等待上的做法叫做「非同步(asynchronous)」。並發和非同步都是單一線程無法實現的。


進程要不要多線程這個由開發者或是運行時虛擬機自己決定,操作系統沒有自動多線程化的義務和能力。

所以你後面的問題基本都沒了。


多線程是為了解決在單一進程等待IO操作時CPU空閑的問題,以及使多道任務同時執行,但是如果沒有IO操作,多線程不比單線程快,因為線程切換時也要佔用指令周期,但是如果單線程被阻塞了,整個進程就被阻塞,如果多線程的話還又別的線程可以執行,所以進程不會被阻塞,如果在做伺服器程序時應該用盡量少的線程,而不是不用多線程,在做PC軟體時,應該充分利用多線程,以加快用戶響應速度


其實是這樣的。

多線程在多核cpu下能明顯提高程序性能,這就好比原來相同的工作,你同時分配給10個人做總比一個人做要來得快。當然,多線程也有別的用處,比如在io等待明顯程序中,如果一個進程來處理,那麼這個進程就一直堵在這裡了。這就好比,做一項工作,讓一個普通人去做,他中間去了趟廁所,結果這件事就要一直等他回來才能繼續做。但如果讓孫悟空來做,他去廁所了,但他幾根頭髮就變出好多小猴子,這些小猴子就可以繼續工作。豈不更快。

所以,你先應該明白線程存在的價值。


可以搶佔計算資源。

比如單核用滿了,內存用了一半,這時候多線程肯定快。

我編程不多,有誤請指出。


看了一的問題, 題主你要好好學操作系統, 就都明白了。


推薦閱讀:

boost 是否像 Linux 一樣提供讀寫自旋鎖機制?
多線程讀內存變慢如何解決?
為什麼在同一進程中創建不同線程,但線程各自的變數無法在線程間互相訪問?
下面代碼是線程不安全的代碼,請問為什麼很難跑出不安全的樣例?

TAG:多線程 | 多線程編程 |