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

首頁 > 系統 > Unix > 正文

《Unix環境高級編程》讀書筆記 第11章-線程

2024-06-28 13:24:24
字體:
來源:轉載
供稿:網友
《Unix環境高級編程》讀書筆記 第11章-線程1. 引言
  • 了解如何使用多個控制線程在單進程環境中執行多個任務。
  • 不管在什么情況下,只要單個資源需要在多個用戶鍵共享,就必須處理一致性問題。
2. 線程概念
  • 典型的Unix進程可以看成只有一個控制線程:一個進程在某一時刻只能做一件事情。
  • 多線程帶來的好處:
    1. 通過為每種事件類型分配單獨的處理線程,可以簡化處理異步事件的代碼。每個線程在進行事件處理時可以采用同步編程模式。
    2. 多個進程必須使用操作系統提供的復制機制才能實現內存和文件描述符的共享。而多個線程自動地可以訪問相同的存儲空間和文件描述符。
    3. 有些問題可以分解從而提高整個程序的吞吐量。將原來串行化執行的任務變成交叉進行,當然,這些任務必須相互獨立、互不依賴。
    4. 交互的程序同樣可以通過使用多線程來改善響應時間,多線程可以把程序中處理用戶輸入輸出的部分與其他部分分開。
  • 處理器的數量并不影響程序結構,所以不管處理器的個數多少,程序都可以通過使用線程得以簡化。而且,即使多線程程序在串行化任務時不得不阻塞,在某些線程在阻塞的時候還有另外一些線程可以運行,所以多線程程序在單處理器上運行還是可以改善響應時間和吞吐量。
  • 我們討論的線程接口來自POSIX.1-2001,稱之為pthread。功能測試宏是_POSIX_THREADS,也可以使用_SC_THREADS常數調用sysconf函數。
3. 線程標識
  • 進程ID在整個系統中是唯一的。而線程ID只有在它所屬的進程上下文中才有意義。
  • 線程ID使用數據類型pthread_t表示,可以用一個結構來代表pthread_t,故須使用下面的函數來對兩個線程ID進行比較
#include <pthread.h>int pthread_equal(pthread_t tid1, pthread_t tid2); Returns: nonzero if equal, 0 otherwise
  • 通過pthread_self函數獲得自身的線程ID
#include <pthread.h>pthread_t pthread_self(void); Returns: the thread ID of the calling thread4. 線程創建
  • 在POSIX線程的情況下,程序開始運行時,它也是以單進程中的單個控制線程啟動的。在創建多個控制線程之前,程序的行為與傳統的進程并沒有什么區別。
  • 通過調用pthread_create函數創建新的線程
#include <pthread.h>int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void *(*start_rtn)(void *), void *restrict arg); Returns: 0 if OK, error number on failure
  • 新創建線程的線程ID會設置到tidp指向的內存單元中
  • atrr參數用于定制各種不同的線程屬性。直NULL時,創建一個具有默認屬性的線程
  • 新創建的線程從start_rtn函數的地址開始運行,該函數只有一個無類型指針參數arg。故如果需要向start_rtn函數傳遞的參數有一個以上,需要把這些參數放到一個結構中,傳遞該結構的地址
  • 線程創建時并不能保證哪個線程先運行:是新創建的線程,還是調用線程。
  • 新創建的線程可以訪問進程的地址空間,并且繼承調用線程的浮點環境和信號屏蔽字,但是該線程的掛起信號集會被清除,即被原線程阻塞之后收到的信號集不會被新線程繼承。
  • 注意:pthread函數在調用失敗時通常會返回錯誤碼,它們并不像其他的POSIX函數一樣設置errno。每個線程都提供errno的副本,這只是為了與使用errno的現有函數兼容。
5. 線程終止
  • 如果進程中的任意線程調用了exit、_Exit、_exit,那么整個進程就會終止
  • 如果默認的動作是終止進程,那么,發送到某個線程的信號就會終止整個進程
  • 單個線程可以通過3種方式退出,而不終止整個進程
    1. 線程可以簡單地從啟動例程中返回,返回值是線程的退出碼
    2. 線程可以被同一進程中的其他線程取消
    3. 線程調用pthread_exit
#include <pthread.h>void pthread_exit(void *rval_ptr);#include <pthread.h>int pthread_join(pthread_t thread, void **rval_ptr); Returns: 0 if OK, error number on failure
  • 進程中的其他進程可以通過調用pthread_join函數訪問到pthread_exit函數的指針參數rval_ptr
  • 調用線程將一直阻塞,直到指定的線程調用pthread_exit、從啟動例程中返回或者被取消。

    1. 如果線程從啟動例程中返回,rval_ptr包含返回碼
    2. 如果線程被取消,由rval_ptr指定的內存單元就設置為PTHREAD_CANCELED
    3. 如果線程調用pthread_exit,rval_ptr指向的內存單元作為返回值傳遞給調用pthread_join函數的其他線程
  • 線程可以通過調用pthread_cancel函數來請求取消同一進程中的其他線程

#include <pthread.h>int pthread_cancel(pthread_t tid); Returns: 0 if OK, error number on failure
  • 在默認情況下,pthread_cancel函數會使得由tid標識的線程的行為表現為如同調用了參數為PTHREAD_CANCELED的pthread_exit函數。但是,線程可以選擇忽略取消或控制如何被取消。
  • 注意:pthread_cancel并不等待線程終止,它僅僅提出請求。
#include <pthread.h>void pthread_cleanup_push(void (*rtn)(void *), void *arg);void pthread_cleanup_pop(int execute);
  • 線程可以安排它退出時需要調用的函數,類似于進程的atexit函數。這樣的函數稱為線程清理處理程序。
  • 一個線程可以建立多個清理處理程序。處理程序記錄在棧中,執行順序與注冊順序相反。
  • 當線程執行以下動作時,由pthread_cleanup_push函數安排的清理函數rtn以單個參數arg被調用:
    1. 調用pthread_exit時
    2. 響應取消請求時
    3. 用非零execute參數調用pthread_cleanup_pop時(以0調用pthread_cleanup_pop函數時,清理函數不被調用)
  • 這些函數有一個限制,因其可以實現為宏,故必須在與現場相同的作用于中以匹配對的形式使用
  • 進程和線程原語的對比
  • 默認情況下,線程的終止狀態會保存直到對該線程調用pthread_join。如果線程已經被分離,線程的底層存儲資源可以在線程終止時立即被收回。在線程被分離后,不能用pthread_join函數等待它的終止狀態,調用該函數會產生未定義行為。
  • 可以調用函數pthread_detach分離線程
#include <pthread.h>int pthread_detach(pthread_t tid); Returns: 0 if OK, error number on failure
  • 可以通過修改傳給函數pthread_create的線程屬性,創建一個已處于分離狀態的線程。
6. 線程同步
  • 當多個控制線程共享相同的內存時,需要確保每個線程看到一致的數據視圖。故當一個線程可以修改的變量,其他線程也可以讀取或修改時,需要對這些線程進行同步,確保它們在訪問變量的存儲內容時不會訪問到無效的值。
  • 在變量修改時間多于一個存儲器訪問周期的處理器結構中,當存儲器讀與存儲器寫這兩個周期交叉時,這種不一致就會出現。

  • 兩個或多個線程試圖在同一時間修改同一變量時,也需要進行同步??紤]變量增量操作的情況:

  • 5個基本的同步機制:互斥量、讀寫鎖、條件變量、自旋鎖、屏障
6.1 互斥量
  • 互斥量從本質上說是一把鎖,在訪問共享資源前對互斥量進行加鎖,在訪問完成后釋放互斥量。
  • 只有將所有線程都設計成遵守相同數據訪問規則的,互斥機制才能正常工作。操作系統并不會為我們做數據訪問的串行化。如果允許其中某個線程在沒有得到鎖的情況下也可以訪問共享資源,那么即使其他的線程在使用共享資源前都申請鎖,也還是會出現數據不一致的問題。
  • 互斥變量使用數據類型pthread_mutex_t表示,使用互斥變量之前,必須對它進行初始化:
    1. 如果是靜態分配的互斥量,可以把它設置為常量PTHREAD_MUTEX_INITIALIZER
    2. 如果是動態分配(通過malloc函數)的互斥量,可以通過調用函數pthread_mutex_init進行初始化;在釋放內存前(通過free函數)需要調用pthread_mutex_destroy
#include <pthread.h>int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr);int pthread_mutex_destroy(pthread_mutex_t *mutex); Both return: 0 if OK, error number on failure
  • 要用默認的屬性初始化互斥量,只需把attr設為NULL
#include <pthread.h>int pthread_mutex_lock(pthread_mutex_t *mutex);int pthread_mutex_trylock(pthread_mutex_t *mutex); // 成功鎖住返回0;鎖住失敗返回EBUSY,不會阻塞int pthread_mutex_unlock(pthread_mutex_t *mutex); All return: 0 if OK, error number on failure6.2 避免死鎖
  • 如果線程試圖對同一個互斥量加鎖兩次,那么它自身就會陷入死鎖狀態。
  • 還有其他情況也會產生死鎖,如線程1先鎖住互斥量A,再鎖互斥量B;而線程2先鎖住互斥量B,再鎖住互斥量A??梢酝ㄟ^限制加鎖的順序避免。
  • 有時候,對互斥量的加鎖進行排序是很困難的。這種情況下,可以先釋放占有的鎖,然后過一段時間再試。
6.3 函數pthread_mutex_timedlock#include <pthread.h>#include <time.h>int pthread_mutex_timedlock(pthread_mutex_t *restrict mutex, const struct timespec *restrict tsptr); Returns: 0 if OK, error number on failure
  • 該函數允許綁定線程阻塞時間,超時后返回錯誤碼ETIMEDOUT
  • 指定愿意等待的絕對時間
6.4 讀寫鎖
  • 讀寫鎖允許更高的并行性
  • 讀寫鎖可以有3種狀態:讀模式下加鎖狀態、寫模式下加鎖狀態、不加鎖狀態。
  • 一次只有一個線程可以占有寫模式的讀寫鎖,但是多個線程可以同時占有讀模式的讀寫鎖

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
97视频在线看| 成人黄色短视频在线观看| 2019中文在线观看| 国产日韩专区在线| 日韩经典中文字幕在线观看| 国产免费一区二区三区在线能观看| 国产玖玖精品视频| 另类少妇人与禽zozz0性伦| 日韩中文在线中文网在线观看| 中文字幕亚洲欧美日韩高清| 久久精品国产亚洲7777| 国产精品久久久久99| 亚洲精品电影网站| 亚洲一区二区三区xxx视频| 欧美在线免费看| 韩国19禁主播vip福利视频| 最近2019年日本中文免费字幕| 一区二区三区视频观看| 久久色免费在线视频| 亚洲大胆人体在线| 亚洲片国产一区一级在线观看| 68精品国产免费久久久久久婷婷| 亚洲人成电影在线播放| 日韩不卡中文字幕| 亚洲国产黄色片| 亚洲综合日韩在线| 91豆花精品一区| 精品久久久久久| 26uuu另类亚洲欧美日本一| 欧美最猛性xxxxx(亚洲精品)| 亚洲男人天堂2019| 国产精品久久久久99| 欧美黄色免费网站| 欧美日韩亚洲91| 久久久久久久一区二区| 日韩免费av一区二区| 精品久久久免费| 亚洲免费福利视频| 成人在线国产精品| 国产亚洲精品久久久优势| 国产玖玖精品视频| 久久男人的天堂| 欧美国产亚洲精品久久久8v| 国产精品自拍小视频| 欧美日韩中文字幕日韩欧美| 中文字幕日韩av电影| 亚洲天堂av女优| 国产综合色香蕉精品| 久久久久久国产免费| 蜜臀久久99精品久久久久久宅男| 久久成人在线视频| 国产精品视频专区| 亚洲性夜色噜噜噜7777| 另类美女黄大片| 欧美三级xxx| 草民午夜欧美限制a级福利片| 亚洲美女www午夜| 欧美在线播放视频| 国产精品自拍网| 精品久久久久久中文字幕一区奶水| 日韩av免费在线| 国产精品r级在线| 久久综合亚洲社区| 伊人亚洲福利一区二区三区| 亚洲九九九在线观看| 国产亚洲精品美女久久久久| 日韩av在线影视| 欧美在线激情视频| 亚洲天堂男人天堂| 91av在线播放视频| 国内精品模特av私拍在线观看| 亚洲a成v人在线观看| 久久99国产精品自在自在app| 久久亚洲影音av资源网| 欧美在线观看视频| 国产精品久久久久久亚洲影视| 麻豆国产va免费精品高清在线| 狠狠躁18三区二区一区| 亚洲欧美中文日韩在线v日本| 国产精品久久久久久搜索| 久久久国产精彩视频美女艺术照福利| 国产精品免费一区| 97视频在线免费观看| 久久久国产影院| 久久久久久久av| 亚洲aaa激情| 色黄久久久久久| 色综合老司机第九色激情| 国产不卡视频在线| 国产婷婷色综合av蜜臀av| 欧美在线性爱视频| 精品偷拍各种wc美女嘘嘘| 日韩电影在线观看永久视频免费网站| 日韩电影在线观看永久视频免费网站| www高清在线视频日韩欧美| 国产区亚洲区欧美区| 欧美性生交xxxxxdddd| 亚洲爱爱爱爱爱| y97精品国产97久久久久久| 色中色综合影院手机版在线观看| 中文字幕亚洲欧美| 久久免费视频观看| 国产欧美日韩高清| 日韩成人在线免费观看| 91免费版网站入口| 日本一区二三区好的精华液| 久久精品国产清自在天天线| 疯狂做受xxxx高潮欧美日本| 中文字幕久热精品在线视频| 欧美黑人巨大xxx极品| 欧美一区二粉嫩精品国产一线天| 久久精品视频网站| 欧美激情精品久久久久久蜜臀| 欧美人在线观看| 777精品视频| 欧洲美女免费图片一区| 精品国产一区久久久| 日本免费一区二区三区视频观看| 欧美成人午夜视频| 国产午夜精品视频免费不卡69堂| 成人久久一区二区三区| 黑人巨大精品欧美一区免费视频| 欧美性少妇18aaaa视频| 亚洲精品久久视频| 日韩av一区二区在线观看| 日韩亚洲欧美中文高清在线| 久久久日本电影| 久久成人亚洲精品| 中文字幕精品在线| 色综合导航网站| 国产视频欧美视频| 一本色道久久88亚洲综合88| 欧美自拍大量在线观看| 日韩欧美精品中文字幕| 97国产在线观看| 久久久精品网站| 国模叶桐国产精品一区| 亚洲xxx视频| 久久视频免费观看| 国产九九精品视频| 疯狂做受xxxx高潮欧美日本| 欧美噜噜久久久xxx| 日韩免费视频在线观看| 美日韩精品免费视频| 国产精品99久久久久久久久久久久| 亚洲国产精品福利| 欧美日韩精品二区| 成人黄色免费在线观看| 亚洲成色777777女色窝| 国产91|九色| 日韩h在线观看| 日韩在线一区二区三区免费视频| 91精品国产91久久久久| 欧美日韩中国免费专区在线看| 亚洲一区二区精品| 亚洲欧美一区二区三区久久| 91精品在线观看视频| 韩剧1988在线观看免费完整版| 成人av电影天堂| 美日韩丰满少妇在线观看| 亚洲欧洲在线播放| 91视频8mav| 九九热最新视频//这里只有精品| 欧美黄色免费网站|