Linux多線程編程,爲何要使用線程,使用線程的理由和優勢等

  線程?爲何有了進程還須要線程呢,他們有什麼區別?使用線程有什麼優點呢?還有多線程編程的一些細節問題,(http://www.0830120.com)如線程之間怎樣同步、互斥,這些東西將在本文中介紹。我在某QQ羣裏見到這樣一道面試題:面試

  是否熟悉POSIX多線程編程技術?如熟悉,編寫程序完成以下功能:編程

  1)有一int型全局變量g_Flag初始值爲0;數據結構

  2) 在主線稱中起動線程1,打印「this is thread1」,並將g_Flag設置爲1多線程

  3) 在主線稱中啓動線程2,打印「this is thread2」,並將g_Flag設置爲2併發

  4) 線程序1須要在線程2退出後才能退出框架

  5) 主線程在檢測到g_Flag從1變爲2,或者從2變爲1的時候退出this

  咱們帶着這題開始這篇文章,結束以後,你們就都會作了。本文的框架以下:線程

  一、進程與線程進程

  進程是程序執行時的一個實例,即它是程序已經執行到何種程度的數據結構的聚集。從內核的觀點看,進程的目的就是擔當分配系統資源(CPU時間、內存等)的基本單位。內存

  線程是進程的一個執行流,是CPU調度和分派的基本單位,它是比進程更小的能獨立運行的基本單位。一個進程由幾個線程組成(擁有不少相對獨立的執行流的用戶程序共享應用程序的大部分數據結構),線程與同屬一個進程的其餘的線程共享進程所擁有的所有資源。

  "進程——資源分配的最小單位,線程——程序執行的最小單位"

  進程有獨立的地址空間,一個進程崩潰後,在保護模式下不會對其它進程產生影響,而線程只是一個進程中的不一樣執行路徑。線程有本身的堆棧和局部變量,但線程沒有單獨的地址空間,一個線程死掉就等於整個進程死掉,因此多進程的程序要比多線程的程序健壯,但在進程切換時,耗費資源較大,效率要差一些。但對於一些要求同時進行而且又要共享某些變量的併發操做,只能用線程,不能用進程。

  二、使用線程的理由

  從上面咱們知道了進程與線程的區別,其實這些區別也就是咱們使用線程的理由。總的來講就是:進程有獨立的地址空間,線程沒有單獨的地址空間(同一進程內的線程共享進程的地址空間)。(下面的內容摘自Linux下的多線程編程)

  使用多線程的理由之一是和進程相比,它是一種很是"節儉"的多任務操做方式。咱們知道,在Linux系統下,啓動一個新的進程必須分配給它獨立的地址空間,創建衆多的數據表來維護它的代碼段、堆棧段和數據段,這是一種"昂貴"的多任務工做方式。而運行於一個進程中的多個線程,它們彼此之間使用相同的地址空間,共享大部分數據,啓動一個線程所花費的空間遠遠小於啓動一個進程所花費的空間,並且,線程間彼此切換所需的時間也遠遠小於進程間切換所須要的時間。據統計,總的說來,一個進程的開銷大約是一個線程開銷的30倍左右,固然,在具體的系統上,這個數據可能會有較大的區別。

  使用多線程的理由之二是線程間方便的通訊機制。對不一樣進程來講,它們具備獨立的數據空間,要進行數據的傳遞只能經過通訊的方式進行,這種方式不只費時,並且很不方便。線程則否則,因爲同一進程下的線程之間共享數據空間,因此一個線程的數據能夠直接爲其它線程所用,這不只快捷,並且方便。固然,數據的共享也帶來其餘一些問題,有的變量不能同時被兩個線程所修改,有的子程序中聲明爲static的數據更有可能給多線程程序帶來災難性的打擊,這些正是編寫多線程程序時最須要注意的地方。

相關文章
相關標籤/搜索