青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

JulyRina's blog
welcome to July Rina's blog
posts - 22,comments - 1,trackbacks - 0

線程是有趣的

了解如何正確運用線程是每一個優(yōu)秀程序員必備的素質(zhì)。線程類似于進(jìn)程。如同進(jìn)程,線程由內(nèi)核按時間分片進(jìn)行管理。在單處理器系統(tǒng)中,內(nèi)核使用時間分片來模擬線程的并發(fā)執(zhí)行,這種方式和進(jìn)程的相同。而在多處理器系統(tǒng)中,如同多個進(jìn)程,線程實際上一樣可以并發(fā)執(zhí)行。
那么為什么對于大多數(shù)合作性任務(wù),多線程比多個獨立的進(jìn)程更優(yōu)越呢?這是因為,線程共享相同的內(nèi)存空間。不同的線程可以存取內(nèi)存中的同一個變量。所以,程序中的所有線程都可以讀或?qū)懧暶鬟^的全局變量。如果曾用 fork() 編寫過重要代碼,就會認(rèn)識到這個工具的重要性。為什么呢?雖然 fork() 允許創(chuàng)建多個進(jìn)程,但它還會帶來以下通信問題: 如何讓多個進(jìn)程相互通信,這里每個進(jìn)程都有各自獨立的內(nèi)存空間。對這個問題沒有一個簡單的答案。雖然有許多不同種類的本地 IPC (進(jìn)程間通信),但它們都遇到兩個重要障礙:
  • 強加了某種形式的額外內(nèi)核開銷,從而降低性能。
  • 對于大多數(shù)情形,IPC 不是對于代碼的“自然”擴展。通常極大地增加了程序的復(fù)雜性。
雙重壞事: 開銷和復(fù)雜性都非好事。如果曾經(jīng)為了支持 IPC 而對程序大動干戈過,那么您就會真正欣賞線程提供的簡單共享內(nèi)存機制。由于所有的線程都駐留在同一內(nèi)存空間,POSIX 線程無需進(jìn)行開銷大而復(fù)雜的長距離調(diào)用。只要利用簡單的同步機制,程序中所有的線程都可以讀取和修改已有的數(shù)據(jù)結(jié)構(gòu)。而無需將數(shù)據(jù)經(jīng)由文件描述符轉(zhuǎn)儲或擠入緊窄的共享內(nèi)存空間。僅此一個原因,就足以讓您考慮應(yīng)該采用單進(jìn)程/多線程模式而非多進(jìn)程/單線程模式。

線程是快捷的

不僅如此。線程同樣還是非常快捷的。與標(biāo)準(zhǔn) fork() 相比,線程帶來的開銷很小。內(nèi)核無需單獨復(fù)制進(jìn)程的內(nèi)存空間或文件描述符等等。這就節(jié)省了大量的 CPU 時間,使得線程創(chuàng)建比新進(jìn)程創(chuàng)建快上十到一百倍。因為這一點,可以大量使用線程而無需太過于擔(dān)心帶來的 CPU 或內(nèi)存不足。使用 fork() 時導(dǎo)致的大量 CPU 占用也不復(fù)存在。這表示只要在程序中有意義,通常就可以創(chuàng)建線程。
當(dāng)然,和進(jìn)程一樣,線程將利用多 CPU。如果軟件是針對多處理器系統(tǒng)設(shè)計的,這就真的是一大特性(如果軟件是開放源碼,則最終可能在不少平臺上運行)。特定類型線程程序(尤其是 CPU 密集型程序)的性能將隨系統(tǒng)中處理器的數(shù)目幾乎線性地提高。如果正在編寫 CPU 非常密集型的程序,則絕對想設(shè)法在代碼中使用多線程。一旦掌握了線程編碼,無需使用繁瑣的 IPC 和其它復(fù)雜的通信機制,就能夠以全新和創(chuàng)造性的方法解決編碼難題。所有這些特性配合在一起使得多線程編程更有趣、快速和靈活。

線程是可移植的

如果熟悉 Linux 編程,就有可能知道 __clone() 系統(tǒng)調(diào)用。__clone() 類似于 fork(),同時也有許多線程的特性。例如,使用 __clone(),新的子進(jìn)程可以有選擇地共享父進(jìn)程的執(zhí)行環(huán)境(內(nèi)存空間,文件描述符等)。這是好的一面。但 __clone() 也有不足之處。正如__clone() 在線幫助指出:
“__clone 調(diào)用是特定于 Linux 平臺的,不適用于實現(xiàn)可移植的程序。欲編寫線程化應(yīng)用程序(多線程控制同一內(nèi)存空間),最好使用實現(xiàn) POSIX 1003.1c 線程 API 的庫,例如 Linux-Threads 庫。參閱 pthread_create(3thr)。”
雖然 __clone() 有線程的許多特性,但它是不可移植的。當(dāng)然這并不意味著代碼中不能使用它。但在軟件中考慮使用 __clone() 時應(yīng)當(dāng)權(quán)衡這一事實。值得慶幸的是,正如 __clone() 在線幫助指出,有一種更好的替代方案:POSIX 線程。如果想編寫 可移植的 多線程代碼,代碼可運行于 Solaris、FreeBSD、Linux 和其它平臺,POSIX 線程是一種當(dāng)然之選。

第一個線程

下面是一個 POSIX 線程的簡單示例程序:
#include <pthread.h> #include <stdlib.h> #include <unistd.h>  void *thread_function(void *arg) {   int i;   for ( i=0; i<20; i++) {     printf("Thread says hi!\n");     sleep(1);   }   return NULL; } int main(void) {   pthread_t mythread;   if ( pthread_create( &mythread, NULL, thread_function, NULL) ) {     printf("error creating thread.");     abort();   }   if ( pthread_join ( mythread, NULL ) ) {     printf("error joining thread.");     abort();   }   exit(0); }
要編譯這個程序,只需先將程序存為 thread1.c,然后輸入:
$ gcc thread1.c -o thread1 -lpthread
運行則輸入:
$ ./thread1

理解 thread1.c

thread1.c 是一個非常簡單的線程程序。雖然它沒有實現(xiàn)什么有用的功能,但可以幫助理解線程的運行機制。下面,我們一步一步地了解這個程序是干什么的。main() 中聲明了變量 mythread,類型是 pthread_t。pthread_t 類型在 pthread.h 中定義,通常稱為“線程 id”(縮寫為 "tid")。可以認(rèn)為它是一種線程句柄。

mythread 聲明后(記住 mythread 只是一個 "tid",或是將要創(chuàng)建的線程的句柄),調(diào)用 pthread_create 函數(shù)創(chuàng)建一個真實活動的線程。不要因為 pthread_create() 在 "if" 語句內(nèi)而受其迷惑。由于 pthread_create() 執(zhí)行成功時返回零而失敗時則返回非零值,將 pthread_create() 函數(shù)調(diào)用放在 if() 語句中只是為了方便地檢測失敗的調(diào)用。讓我們查看一下 pthread_create 參數(shù)。第一個參數(shù) &mythread 是指向 mythread 的指針。第二個參數(shù)當(dāng)前為 NULL,可用來定義線程的某些屬性。由于缺省的線程屬性是適用的,只需將該參數(shù)設(shè)為 NULL。

第三個參數(shù)是新線程啟動時調(diào)用的函數(shù)名。本例中,函數(shù)名為 thread_function()。當(dāng) thread_function() 返回時,新線程將終止。本例中,線程函數(shù)沒有實現(xiàn)大的功能。它僅將 "Thread says hi!" 輸出 20 次然后退出。注意 thread_function() 接受 void * 作為參數(shù),同時返回值的類型也是 void *。這表明可以用 void * 向新線程傳遞任意類型的數(shù)據(jù),新線程完成時也可返回任意類型的數(shù)據(jù)。那如何向線程傳遞一個任意參數(shù)?很簡單。只要利用 pthread_create() 中的第四個參數(shù)。本例中,因為沒有必要將任何數(shù)據(jù)傳給微不足道的 thread_function(),所以將第四個參數(shù)設(shè)為 NULL。

您也許已推測到,在 pthread_create() 成功返回之后,程序?qū)瑑蓚€線程。等一等, 兩個 線程?我們不是只創(chuàng)建了一個線程嗎?不錯,我們只創(chuàng)建了一個進(jìn)程。但是主程序同樣也是一個線程。可以這樣理解:如果編寫的程序根本沒有使用 POSIX 線程,則該程序是單線程的(這個單線程稱為“主”線程)。創(chuàng)建一個新線程之后程序總共就有兩個線程了。

我想此時您至少有兩個重要問題。第一個問題,新線程創(chuàng)建之后主線程如何運行。答案,主線程按順序繼續(xù)執(zhí)行下一行程序(本例中執(zhí)行 "if (pthread_join(...))")。第二個問題,新線程結(jié)束時如何處理。答案,新線程先停止,然后作為其清理過程的一部分,等待與另一個線程合并或“連接”。

現(xiàn)在,來看一下 pthread_join()。正如 pthread_create() 將一個線程拆分為兩個, pthread_join() 將兩個線程合并為一個線程。pthread_join() 的第一個參數(shù)是 tid mythread。第二個參數(shù)是指向 void 指針的指針。如果 void 指針不為 NULL,pthread_join 將線程的 void * 返回值放置在指定的位置上。由于我們不必理會 thread_function() 的返回值,所以將其設(shè)為 NULL.

您會注意到 thread_function() 花了 20 秒才完成。在 thread_function() 結(jié)束很久之前,主線程就已經(jīng)調(diào)用了 pthread_join()。如果發(fā)生這種情況,主線程將中斷(轉(zhuǎn)向睡眠)然后等待 thread_function() 完成。當(dāng) thread_function() 完成后, pthread_join() 將返回。這時程序又只有一個主線程。當(dāng)程序退出時,所有新線程已經(jīng)使用 pthread_join() 合并了。這就是應(yīng)該如何處理在程序中創(chuàng)建的每個新線程的過程。如果沒有合并一個新線程,則它仍然對系統(tǒng)的最大線程數(shù)限制不利。這意味著如果未對線程做正確的清理,最終會導(dǎo)致 pthread_create() 調(diào)用失敗。


無父,無子

如果使用過 fork() 系統(tǒng)調(diào)用,可能熟悉父進(jìn)程和子進(jìn)程的概念。當(dāng)用 fork() 創(chuàng)建另一個新進(jìn)程時,新進(jìn)程是子進(jìn)程,原始進(jìn)程是父進(jìn)程。這創(chuàng)建了可能非常有用的層次關(guān)系,尤其是等待子進(jìn)程終止時。例如,waitpid() 函數(shù)讓當(dāng)前進(jìn)程等待所有子進(jìn)程終止。waitpid() 用來在父進(jìn)程中實現(xiàn)簡單的清理過程。

而 POSIX 線程就更有意思。您可能已經(jīng)注意到我一直有意避免使用“父線程”和“子線程”的說法。這是因為 POSIX 線程中不存在這種層次關(guān)系。雖然主線程可以創(chuàng)建一個新線程,新線程可以創(chuàng)建另一個新線程,POSIX 線程標(biāo)準(zhǔn)將它們視為等同的層次。所以等待子線程退出的概念在這里沒有意義。POSIX 線程標(biāo)準(zhǔn)不記錄任何“家族”信息。缺少家族信息有一個主要含意:如果要等待一個線程終止,就必須將線程的 tid 傳遞給 pthread_join()。線程庫無法為您斷定 tid。

對大多數(shù)開發(fā)者來說這不是個好消息,因為這會使有多個線程的程序復(fù)雜化。不過不要為此擔(dān)憂。POSIX 線程標(biāo)準(zhǔn)提供了有效地管理多個線程所需要的所有工具。實際上,沒有父/子關(guān)系這一事實卻為在程序中使用線程開辟了更創(chuàng)造性的方法。例如,如果有一個線程稱為線程 1,線程 1 創(chuàng)建了稱為線程 2 的線程,則線程 1 自己沒有必要調(diào)用 pthread_join() 來合并線程 2,程序中其它任一線程都可以做到。當(dāng)編寫大量使用線程的代碼時,這就可能允許發(fā)生有趣的事情。例如,可以創(chuàng)建一個包含所有已停止線程的全局“死線程列表”,然后讓一個專門的清理線程專等停止的線程加到列表中。這個清理線程調(diào)用 pthread_join() 將剛停止的線程與自己合并。現(xiàn)在,僅用一個線程就巧妙和有效地處理了全部清理。

更多資料
posted on 2015-03-16 21:18 JulyRina 閱讀(263) 評論(0)  編輯 收藏 引用 所屬分類: 網(wǎng)絡(luò)安全
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产乱码精品1区2区3区| 日韩亚洲一区二区| 亚洲激情一区二区| 亚洲高清一二三区| 亚洲国产你懂的| 亚洲激情视频网| 亚洲激情偷拍| 亚洲一区二区精品在线| 亚洲欧美日韩精品久久| 性做久久久久久久免费看| 久久精品123| 欧美福利一区二区三区| 亚洲精品一区在线| 亚洲一卡久久| 久久久久一区二区三区| 欧美激情视频给我| 国产精品嫩草99av在线| 国产一区二区精品丝袜| 亚洲欧洲在线免费| 午夜久久久久| 亚洲高清影视| 亚洲中字黄色| 毛片av中文字幕一区二区| 欧美午夜宅男影院| 亚洲国产成人porn| 性色一区二区| 亚洲欧洲在线一区| 欧美在线免费视频| 欧美日韩亚洲一区二| 国产资源精品在线观看| 一区二区三区三区在线| 久久综合国产精品| 亚洲一级片在线观看| 免费日韩av| 国产日韩欧美一区在线| 中文在线不卡| 亚洲第一黄网| 欧美一区二区三区视频在线| 欧美巨乳在线| 亚洲国产成人精品视频| 国产一区二区三区网站| 黄色综合网站| 亚洲制服欧美中文字幕中文字幕| 久久视频在线视频| 亚洲一区二区毛片| 欧美日韩国产在线看| 亚洲国产成人av| 久久久一区二区| 亚洲欧美中文日韩在线| 欧美四级伦理在线| 日韩一区二区精品视频| 欧美顶级艳妇交换群宴| 久久久精品国产99久久精品芒果| 国产精品久久久久久久久动漫| 日韩网站在线| 欧美国产日韩精品免费观看| 欧美综合国产| 黄色成人av在线| 久久久在线视频| 亚洲欧美一区在线| 国产人妖伪娘一区91| 亚洲综合色自拍一区| 日韩一区二区福利| 国产精品国产自产拍高清av| 亚洲一区视频在线观看视频| 亚洲精品乱码视频| 欧美人与性禽动交情品| 99国内精品久久| 99这里有精品| 国产精品推荐精品| 午夜在线精品| 久久成人综合网| 揄拍成人国产精品视频| 毛片一区二区三区| 久热综合在线亚洲精品| 亚洲国产va精品久久久不卡综合| 欧美激情一区在线观看| 欧美激情亚洲精品| 一级成人国产| 亚洲特级片在线| 国产欧美视频一区二区| 鲁大师成人一区二区三区| 牛牛影视久久网| 亚洲一区二区视频| 欧美一区二区三区成人| 亚洲国产综合视频在线观看| 日韩亚洲在线观看| 国产一区二区三区的电影| 欧美国产视频在线| 欧美日韩网址| 久久久久久有精品国产| 欧美经典一区二区| 欧美一区亚洲二区| 久久久久久久久久久成人| 日韩视频永久免费观看| 亚洲无线视频| 亚洲黄色在线| 亚洲免费在线| 亚洲精品综合| 亚洲欧美韩国| 夜夜嗨av色一区二区不卡| 欧美电影在线免费观看网站| 久久动漫亚洲| 欧美日韩美女在线观看| 欧美一区二视频| 开心色5月久久精品| 一区二区三区日韩精品| 久久久久久黄| 亚洲在线免费视频| 老司机免费视频一区二区三区 | 亚洲黄一区二区三区| 国产精品盗摄久久久| 欧美成人一区二免费视频软件| 欧美色网在线| 亚洲人成人一区二区三区| 国产亚洲精品久久久久动| 99精品国产在热久久下载| 尤物精品国产第一福利三区| 中文精品一区二区三区 | 国产一区二区三区久久 | 欧美高清视频免费观看| 国产精品腿扒开做爽爽爽挤奶网站| 欧美激情一区二区三区在线视频 | 国产精品夜色7777狼人| 91久久在线观看| 亚洲激情一区二区| 久久久久久国产精品mv| 久久九九免费视频| 国产精品va在线播放| 最近看过的日韩成人| 极品中文字幕一区| 欧美一区久久| 久久国产精品久久久久久| 国产精品爽黄69| 亚洲欧美99| 久久成人人人人精品欧| 国产精品一区免费在线观看| 亚洲一本视频| 欧美夜福利tv在线| 国产精品一区亚洲| 亚洲欧美一区二区三区极速播放| 欧美一二三视频| 国产亚洲精品福利| 欧美在线免费视频| 免费一级欧美片在线观看| 黄色国产精品| 久久亚洲精品一区| 亚洲国产精品成人一区二区| 亚洲人成久久| 欧美日韩理论| 亚洲欧美另类国产| 久久综合综合久久综合| 在线欧美不卡| 欧美精品一区二区三区在线看午夜 | 在线一区二区三区四区| 亚洲一区免费| 国产日产精品一区二区三区四区的观看方式 | 免费欧美日韩| 亚洲黄色大片| 欧美激情综合五月色丁香小说| 亚洲区免费影片| 亚洲欧美日韩精品一区二区| 国产精品一区二区在线| 久久久之久亚州精品露出| 欧美激情亚洲综合一区| 亚洲一区二区三区在线观看视频 | 欧美在线免费看| 国产在线观看91精品一区| 久久综合伊人77777| 亚洲精品系列| 欧美在线视频播放| 亚洲高清二区| 欧美视频中文在线看| 久久久久久高潮国产精品视| 亚洲国产精品999| 欧美亚洲一区| 亚洲三级免费观看| 国产日韩精品综合网站| 欧美精品www在线观看| 亚洲一区美女视频在线观看免费| 久久精品在线视频| 99精品99| 激情丁香综合| 国产精品久久久久久久一区探花| 久久久久久久精| 亚洲一区二区三区精品动漫| 欧美mv日韩mv国产网站app| 亚洲自拍都市欧美小说| 亚洲黄色成人久久久| 国产一区在线免费观看| 欧美偷拍另类| 欧美chengren| 久久国产一区| 亚洲一区在线视频| 亚洲国产精品精华液2区45| 久久久久综合网| 亚洲一区视频| 亚洲每日在线| 亚洲黄页一区| 亚洲国产成人av|