亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

POSIX 線程詳解(1)

2019-11-17 05:38:49
字體:
來源:轉載
供稿:網友

  一種支持內存共享的簡捷工具

作者:Daniel Robbins

內容:


線程是有趣的
線程是快捷的
線程是可移植的
第一個線程
無父,無子
同步漫游
參考資料
關于作者



POSIX(可移植操作系統接口)線程是提高代碼響應和性能的有力手段。在本系列中,Daniel Robbins 向您精確地展示在編程中如何使用線程。其中還涉及大量幕后細節,讀完本系列文章,您完全可以運用 POSIX 線程創建多線程程序。

線程是有趣的
了解如何正確運用線程是每一個優秀程序員必備的素質。線程類似于進程。如同進程,線程由內核按時間分片進行治理。在單處理器系統中,內核使用時間分片來模擬線程的并發執行,這種方式和進程的相同。而在多處理器系統中,如同多個進程,線程實際上一樣可以并發執行。

那么為什么對于大多數合作性任務,多線程比多個獨立的進程更優越呢?這是因為,線程共享相同的內存空間。不同的線程可以存取內存中的同一個變量。所以,程序中的所有線程都可以讀或寫聲明過的全局變量。假如曾用 fork() 編寫過重要代碼,就會熟悉到這個工具的重要性。為什么呢?雖然 fork() 答應創建多個進程,但它還會帶來以下通信問題: 如何讓多個進程相互通信,這里每個進程都有各自獨立的內存空間。對這個問題沒有一個簡單的答案。雖然有許多不同種類的本地 ipC (進程間通信),但它們都碰到兩個重要障礙:


強加了某種形式的額外內核開銷,從而降低性能。
對于大多數情形,IPC 不是對于代碼的“自然”擴展。通常極大地增加了程序的復雜性。

雙重壞事: 開銷和復雜性都非好事。假如曾經為了支持 IPC 而對程序大動干戈過,那么您就會真正欣賞線程提供的簡單共享內存機制。由于所有的線程都駐留在同一內存空間,POSIX 線程無需進行開銷大而復雜的長距離調用。只要利用簡單的同步機制,程序中所有的線程都可以讀取和修改已有的數據結構。而無需將數據經由文件描述符轉儲或擠入緊窄的共享內存空間。僅此一個原因,就足以讓您考慮應該采用單進程/多線程模式而非多進程/單線程模式。

線程是快捷的
不僅如此。線程同樣還是非??旖莸?。與標準 fork() 相比,線程帶來的開銷很小。內核無需單獨復制進程的內存空間或文件描述符等等。這就節省了大量的 CPU 時間,使得線程創建比新進程創建快上十到一百倍。因為這一點,可以大量使用線程而無需太過于擔心帶來的 CPU 或內存不足。使用 fork() 時導致的大量 CPU 占用也不復存在。這表示只要在程序中有意義,通常就可以創建線程。

當然,和進程一樣,線程將利用多 CPU。假如軟件是針對多處理器系統設計的,這就真的是一大特性(假如軟件是開放源碼,則最終可能在不少平臺上運行)。特定類型線程程序(尤其是 CPU 密集型程序)的性能將隨系統中處理器的數目幾乎線性地提高。假如正在編寫 CPU 非常密集型的程序,則絕對想設法在代碼中使用多線程。一旦把握了線程編碼,無需使用繁瑣的 IPC 和其它復雜的通信機制,就能夠以全新和創造性的方法解決編碼難題。所有這些特性配合在一起使得多線程編程更有趣、快速和靈活。

線程是可移植的
假如熟悉 linux 編程,就有可能知道 __clone() 系統調用。__clone() 類似于 fork(),同時也有許多線程的特性。例如,使用 __clone(),新的子進程可以有選擇地共享父進程的執行環境(內存空間,文件描述符等)。這是好的一面。但 __clone() 也有不足之處。正如__clone() 在線幫助指出:

“__clone 調用是特定于 Linux 平臺的,不適用于實現可移植的程序。欲編寫線程化應用程序(多線程控制同一內存空間),最好使用實現 POSIX 1003.1c 線程 API 的庫,例如 Linux-Threads 庫。參閱 pthread_create(3thr)?!?

雖然 __clone() 有線程的許多特性,但它是不可移植的。當然這并不意味著代碼中不能使用它。但在軟件中考慮使用 __clone() 時應當權衡這一事實。值得慶幸的是,正如 __clone() 在線幫助指出,有一種更好的替代方案:POSIX 線程。假如想編寫可移植的多線程代碼,代碼可運行于 Solaris、FreeBSD、Linux 和其它平臺,POSIX 線程是一種當然之選。

第一個線程
下面是一個 POSIX 線程的簡單示例程序:


thread1.c
#include
#include
#include

void *thread_function(void *arg) {
int i;
for ( i=0; i<20; i++) {
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 是一個非常簡單的線程程序。雖然它沒有實現什么有用的功能,但可以幫助理解線程的運行機制。下面,我們一步一步地了解這個程序是干什么的。main() 中聲明了變量 mythread,類型是 pthread_t。pthread_t 類型在 pthread.h 中定義,通常稱為“線程 id”(縮寫為 "tid")??梢哉J為它是一種線程句柄。

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

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

您也許已推測到,在 pthread_create() 成功返回之后,程序將包含兩個線程。等一等,兩個線程?我們不是只創建了一個線程嗎?不錯,我們只創建了一個進程。但是主程序同樣也是一個線程??梢赃@樣理解:假如編寫的程序根本沒有使用 POSIX 線程,則該程序是單線程的(這個單線程稱為“主”線程)。創建一個新線程之后程序總共就有兩個線程了。

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

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

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


無父,無子
假如使用過 fork() 系統調用,可能熟悉父進程和子進程的概念。當用 fork() 創建另一個新進程時,新進程是子進程,原始進程是父進程。這創建了可能非常有用的層次關系,尤其是等待子進程終止時。例如,waitpid() 函數讓當前進程等待所有子進程終

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
色伦专区97中文字幕| 欧美视频在线观看 亚洲欧| 国产日韩欧美在线视频观看| 亚洲乱码国产乱码精品精| 国产精品jvid在线观看蜜臀| 青草热久免费精品视频| 亚洲精品97久久| 最近2019中文免费高清视频观看www99| 在线午夜精品自拍| 国产精品久久视频| 国产精品久久久91| 91久久久久久久| 国产成人精彩在线视频九色| 久久久精品999| 欧美另类在线播放| 欧美片一区二区三区| 欧美电影院免费观看| 日韩www在线| 亚洲成色777777在线观看影院| 91亚洲国产成人久久精品网站| 久久国产精品电影| 亚洲欧洲偷拍精品| 日韩欧美a级成人黄色| 欧美国产精品日韩| 欧美贵妇videos办公室| 亚洲激情视频网站| 国产精品视频中文字幕91| 2020欧美日韩在线视频| 最近中文字幕2019免费| 亚洲精品第一页| 九九热这里只有精品6| 国产精品福利观看| 欧美激情一级二级| 欧美剧在线观看| 亚洲高清福利视频| 91久久久久久久久久久| 日韩视频免费观看| 国产精品久久一| 91亚洲精品在线观看| 亚洲自拍偷拍视频| 日韩在线资源网| 精品免费在线视频| 亚洲国产欧美自拍| 国产午夜精品麻豆| 日韩成人在线免费观看| 亚洲va欧美va在线观看| 精品偷拍各种wc美女嘘嘘| 亚洲一区二区三区香蕉| 午夜精品久久久99热福利| 色哟哟亚洲精品一区二区| 亚洲xxxx在线| 色噜噜狠狠狠综合曰曰曰| 国产精品久久久久久久美男| 97碰在线观看| 韩日欧美一区二区| 亚洲久久久久久久久久久| 一个人看的www久久| 中国日韩欧美久久久久久久久| 国内精品久久久久久久久| 日韩精品在线视频| 中文字幕欧美精品在线| 欧美视频在线观看免费网址| 精品无人区乱码1区2区3区在线| 国产欧美一区二区白浆黑人| 日韩在线观看免费高清| 亚洲一区二区三区四区在线播放| 九九精品视频在线观看| 91精品国产综合久久久久久蜜臀| 高清欧美性猛交| 国产欧美一区二区三区在线看| 欧美中在线观看| 日韩精品免费综合视频在线播放| 91地址最新发布| 国产精品啪视频| 精品中文字幕在线2019| 日韩欧美在线网址| 黄色精品一区二区| 在线亚洲国产精品网| 国内免费精品永久在线视频| 亚洲欧美日韩一区二区三区在线| www.国产一区| 一区二区三区视频在线| 欧美伊久线香蕉线新在线| 亚洲欧美另类国产| 日本免费一区二区三区视频观看| 欧美大荫蒂xxx| 日本精品久久久久久久| 国产999在线| 久久成人av网站| 亚洲视频欧洲视频| 国产精品网站入口| 国产精品免费一区豆花| 国产精品欧美一区二区三区奶水| 91高清免费在线观看| 亚洲国产精品电影| 91欧美精品成人综合在线观看| 国产精品h片在线播放| 欧美俄罗斯乱妇| 亚洲aa中文字幕| 色妞在线综合亚洲欧美| 国产一区二区三区在线| 欧美高清视频免费观看| 亚洲精品福利免费在线观看| 欧美老女人性生活| 久色乳综合思思在线视频| 国产精品视频精品| 午夜精品一区二区三区在线| 不卡毛片在线看| 欧美限制级电影在线观看| 久热在线中文字幕色999舞| 国产z一区二区三区| 国产一区二区三区在线观看网站| 国产精品成人一区二区| 亚洲天天在线日亚洲洲精| 国产情人节一区| 91亚洲精品视频| 91av在线国产| 亚洲人午夜精品免费| 国产精品自拍小视频| 91在线国产电影| 成人免费视频xnxx.com| 欧美日韩不卡合集视频| 日韩av日韩在线观看| 欧美大片免费观看| 国产精品免费福利| 中文字幕亚洲欧美在线| 精品久久中文字幕| 在线观看国产精品日韩av| 成人日韩在线电影| 国产精品6699| 一区二区日韩精品| 亚洲欧美另类国产| 亚洲石原莉奈一区二区在线观看| 亚洲毛片在线免费观看| 欧美日韩美女视频| 欧美日韩国产123| 日产日韩在线亚洲欧美| 亚洲免费电影一区| 国产精品爽爽爽| 亚洲女人天堂色在线7777| 欧美日韩美女视频| 欧美一级高清免费| 国产成人精品久久二区二区| 欧美精品在线免费观看| 国产精品一二三在线| 欧美午夜女人视频在线| 亚洲一区二区精品| 欧美激情图片区| 亚洲一区中文字幕| 久久视频在线直播| 国产欧美在线播放| 久久综合国产精品台湾中文娱乐网| 欧美黑人性生活视频| 日本欧美爱爱爱| 亚洲美女喷白浆| 91久久综合亚洲鲁鲁五月天| 欧美日韩国产成人在线| 久久天天躁日日躁| 日本乱人伦a精品| 成人免费观看49www在线观看| 亚洲成人精品久久| 最近2019年好看中文字幕视频| 日韩欧美高清在线视频| 久久久91精品国产|