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

首頁 > 系統(tǒng) > Unix > 正文

《Unix環(huán)境高級編程》讀書筆記 第11章-線程

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

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

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

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

  • 5個基本的同步機制:互斥量、讀寫鎖、條件變量、自旋鎖、屏障
6.1 互斥量
  • 互斥量從本質(zhì)上說是一把鎖,在訪問共享資源前對互斥量進行加鎖,在訪問完成后釋放互斥量。
  • 只有將所有線程都設(shè)計成遵守相同數(shù)據(jù)訪問規(guī)則的,互斥機制才能正常工作。操作系統(tǒng)并不會為我們做數(shù)據(jù)訪問的串行化。如果允許其中某個線程在沒有得到鎖的情況下也可以訪問共享資源,那么即使其他的線程在使用共享資源前都申請鎖,也還是會出現(xiàn)數(shù)據(jù)不一致的問題。
  • 互斥變量使用數(shù)據(jù)類型pthread_mutex_t表示,使用互斥變量之前,必須對它進行初始化:
    1. 如果是靜態(tài)分配的互斥量,可以把它設(shè)置為常量PTHREAD_MUTEX_INITIALIZER
    2. 如果是動態(tài)分配(通過malloc函數(shù))的互斥量,可以通過調(diào)用函數(shù)pthread_mutex_init進行初始化;在釋放內(nèi)存前(通過free函數(shù))需要調(diào)用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設(shè)為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 避免死鎖
  • 如果線程試圖對同一個互斥量加鎖兩次,那么它自身就會陷入死鎖狀態(tài)。
  • 還有其他情況也會產(chǎn)生死鎖,如線程1先鎖住互斥量A,再鎖互斥量B;而線程2先鎖住互斥量B,再鎖住互斥量A。可以通過限制加鎖的順序避免。
  • 有時候,對互斥量的加鎖進行排序是很困難的。這種情況下,可以先釋放占有的鎖,然后過一段時間再試。
6.3 函數(shù)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
  • 該函數(shù)允許綁定線程阻塞時間,超時后返回錯誤碼ETIMEDOUT
  • 指定愿意等待的絕對時間
6.4 讀寫鎖
  • 讀寫鎖允許更高的并行性
  • 讀寫鎖可以有3種狀態(tài):讀模式下加鎖狀態(tài)、寫模式下加鎖狀態(tài)、不加鎖狀態(tài)。
  • 一次只有一個線程可以占有寫模式的讀寫鎖,但是多個線程可以同時占有讀模式的讀寫鎖

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
亚洲二区自拍| 欧美电影在线观看免费| 不卡一区二区三区四区五区| 图片区日韩欧美亚洲| 国产精品久久久久久久久久久久久久久久| 亚洲精品不卡在线观看| 亚洲大奶少妇| 91麻豆精品国产91久久久资源速度| 久久亚洲私人国产精品va| 亚洲桃花岛网站| 91国产精品视频在线| 欧美日韩亚洲综合在线 欧美亚洲特黄一级| 日本成人免费视频| h无码动漫在线观看| 久久综合一区二区| 亚洲精品水蜜桃| 91精品国产自产在线观看永久| www.av成人| 久久er热在这里只有精品66| 91久久香蕉国产日韩欧美9色| 97人人爽人人爽人人爽| 日本高清免费不卡视频| 国产毛片在线视频| 在线观看国产一级片| 激情丁香综合| 国产乱淫片视频| 亚洲精品乱码久久久久久久久久久久| 亚洲丝袜另类动漫二区| 欧美日韩国产经典色站一区二区三区| 国产成人精品999在线观看| 亚洲国产高清在线观看视频| 欧美做受高潮中文字幕| 1024国产在线| 国产精品自拍片| 国产精品久久网站| 欧洲生活片亚洲生活在线观看| 国产成人精品亚洲日本在线桃色| 精精国产xxxx视频在线| 国产一区二区三区乱码| 亚洲人成电影网站色mp4| 色偷偷偷亚洲综合网另类| 国产精品久久久久久久第一福利| 免费一级a毛片夜夜看| www.蜜臀av.com| 久久精品国产精品亚洲| 女人让男人操自己视频在线观看| 不卡欧美aaaaa| 欧美做受高潮6| 精品国产一区二区三区在线| 国产精品久久久久9999| 精品少妇人妻一区二区黑料社区| 少妇高潮av久久久久久| 色婷婷av一区二区三区之红樱桃| 欧美精品在线第一页| 久久久久久久久久久久久久久国产| 久久久pmvav| 国产精品乱码视频| 在线观看免费国产小视频| 精品国产精品国产精品| 国产夫妻在线播放| 国产片在线播放| 丁香婷婷久久久综合精品国产| 欧美夫妻性生活| 日av在线播放中文不卡| 国产精品女人网站| 国产欧美精品区一区二区三区| 亚洲精品伊人| 91精品精品| 亚洲综合精品四区| 91在线网站视频| 国产情侣在线视频| 日韩av片专区| 欧美性三三影院| 日韩欧美亚洲另类制服综合在线| 亚洲成a人片77777老司机| 国产精品视频流白浆免费视频| 久久九九免费视频| 黄色av免费在线观看| 国产成人一区二区在线| 另类小说一区二区三区| 色就是色亚洲色图| 久久婷婷人人澡人人喊人人爽| 91玉足脚交白嫩脚丫| 久久99国产精品一区| 日韩三区在线观看| 久久国产精品波多野结衣av| 丰满人妻一区二区三区无码av| 久久综合88中文色鬼| 亚洲欧美日本一区| 激情久久av一区av二区av三区| 免费av不卡| 欧美高清视频在线观看| 欧美午夜电影在线观看| 精品卡一卡二卡三卡四在线| 久久久久久久国产精品视频| 欧美精品xxx| 韩国av在线免费观看| 免费网站在线观看人| 国产精品毛片无遮挡高清| 欧美日韩激情视频在线观看| www视频网站| 日韩一区二区三区在线观看视频| 欧洲午夜精品| 日韩激情小视频| 国产美女自慰在线观看| 中文字幕不卡的av| 欧美mv日韩mv国产网站app| 国产精品国产a级| 91chinesevideo永久地址| 国产一区视频在线观看免费| 好吊色免费视频| 亚洲一区在线观看免费观看电影高清| 快射视频在线观看| 久草视频国产在线| 我要色综合中文字幕| 欧美激情视频在线观看| 四虎影视4hu4虎成人| 五月婷婷导航| 午夜在线视频免费| 国产在视频线精品视频| 久久电影网站中文字幕| 激情四房婷婷| 国产成人精品亚洲线观看| 日韩av一卡| 久久国产一区二区三区| 国产欧美一区二区三区国产幕精品| 亚洲区成人777777精品| 日韩精品中文字幕吗一区二区| 日本不卡一二三区| 上原亚衣av一区二区三区| 91原色影院| 999在线免费观看视频| 国产精品嫩草影院av蜜臀| 小说区图片区色综合区| 色婷婷综合视频在线观看| 日韩视频在线免费看| 日韩男人天堂| 在线视频国产区| 亚洲免费观看高清在线观看| 亚洲成人一区在线| 国产在线拍揄自揄视频不卡99| h狠狠躁死你h高h| 91精品视频在线免费观看| 国产三级精品三级| 黄网av在线| 久久精品国产96久久久香蕉| 一区在线观看视频| 国产日韩欧美在线播放不卡| 久久天堂久久| 欧美性猛交p30| 国产精品500部| 天堂电影一区| 久久精品日产第一区二区| 亚洲国语精品自产拍在线观看| 福利h视频在线| 亚洲图片小说综合| 一区二区在线中文字幕电影视频| 粉嫩老牛aⅴ一区二区三区| 国产精品亚洲一区二区三区| 女人床在线观看| 激情伊人五月天久久综合| 正义之心1992免费观看全集完整版| 亚洲AV第二区国产精品| 亚洲精品视频一区二区| 久久久久久伊人| 黑人と日本人の交わりビデオ| 高清一区二区三区四区五区| 久久久久久亚洲综合| 国产亚洲精品自在线观看| 红桃视频国产一区| 中文字幕亚洲一区| 啊啊啊啊啊啊啊视频在线播放| 日本中文字幕视频一区| 石原莉奈一区二区三区在线观看| 成人久久18免费网站图片| 欧洲毛片在线| 超碰97久久| 日韩欧美亚洲一区二区三区| 永久亚洲成a人片777777| 欧美吞精做爰啪啪高潮| 国产裸体美女永久免费无遮挡| 国产高清在线看| 免费av在线网址| av电影在线免费观看| 日本十八禁视频无遮挡| 妞干网在线视频| 日韩在线电影| 欧美国产另类| 久久大香伊蕉在人线观看热2| 性猛交xxxx乱大交孕妇印度| 中文字幕欧美人妻精品一区蜜臀| 91成品人影院| 麻豆国产传媒av福利| 欧美捆绑视频| 国产精品国产三级国产aⅴ浪潮| 久久精品aⅴ无码中文字字幕重口| 欧美国产日韩精品免费观看| 日本不卡电影| 黄色精品网站| 欧美国产中文字幕| 亚洲黄色av网站| 影音先锋男人资源站| 97在线视频观看| 欧美黄色三级| 999国产视频| www.午夜色大片| jizz性欧美10| 久久这里有精品15一区二区三区| 国产精品免费无遮挡| av中文资源在线资源免费观看| 成人激情电影一区二区| 日韩日韩日韩日韩日韩| 美女18一级毛片一品久道久久综合| 欧美在线观看视频网站| 国产免费看av| 又色又爽又高潮免费视频国产| 亚洲色图偷拍| 99精品福利视频| 欧美中文字幕在线观看视频| 国产美女精品在线| 久久视频国产精品免费视频在线| 国产91足控脚交在线观看| 色琪琪综合男人的天堂aⅴ视频| 2019中文字幕在线电影免费| 国产福利一区二区三区在线播放| 欧美乱妇15p| 全网国产福利在线播放| 欧美风情在线视频| 亚洲成在线观看| 日韩av综合| www99热| 精品欧美午夜寂寞影院| 日韩第一区第二区| 国产午夜精品理论片a级大结局| 免费一级a毛片| 成人午夜sm精品久久久久久久| 好男人www社区在线视频夜恋| 欧美一级片网址| 啊v在线视频| 91 视频免费观看| 亚洲制服一区| 自拍偷拍精选| 一区二区三区四区不卡在线| 青青草视频免费在线观看| 成人午夜精品久久久久久久蜜臀| 91在线一区二区| 国产精品久久久久久久久免费樱桃| 麻豆91精品| 欧美日韩国产成人高清视频| 青梅竹马是消防员在线| 国产精品视频h| 久久久久久久久久99| 成人97人人超碰人人99| 国产精品电影久久久久电影网| 男人的天堂在线视频| 精品一区二区观看| 亚洲无码精品国产| 日本欧美在线| 97在线视频免费观看完整版| 久久激情视频久久| 亚洲欧洲成人| 99久久精品无免国产免费| 99在线精品视频免费观看软件| 天堂在线视频| 亚洲欧美中文字幕在线一区| 国产精品一品二品| 国产一区二区三区四区三区四| 在线日本中文字幕| 日本一区二区黄色| 香蕉久久久久久| 日本一区二区三区免费乱视频| 一本色道久久| 香蕉视频免费在线看| 日韩经典一区| 国产偷人妻精品一区| 日韩视频一区二区三区在线播放| 中文在线免费观看| 成年人网站免费视频| 久久成人一区二区| 国产又爽又黄的激情精品视频| 久久av色综合| 亚洲一区日韩在线| 午夜视频在线免费播放| 日本美女高潮视频| 毛片在线播放a| 好想男人揉我下面好多水| 人与动物性xxxx| 久久精品久久99精品久久| 少妇高潮大叫好爽喷水| 手机在线观看毛片| 精品午夜福利在线观看| 亚洲一二三四2021不卡| 国产按摩一区二区三区| 国产日韩精品一区二区三区在线| 日韩电影网1区2区| 日韩欧美在线免费观看视频| 亚洲图片欧美一区| 国产精品久久久久久av福利| 亚洲一区二区少妇| 久久久国产精品成人免费| 91欧美日韩一区| 亚洲无av在线中文字幕| 久久精品国产精品亚洲综合| 色妇色综合久久夜夜| 日本久久久久亚洲中字幕| 国产精品aaaa| 久久一区二区三区喷水| 欧美日韩国产综合视频在线观看| 国产黄视频在线| 精品视频在线免费| 综合在线视频| 性xxxxfreexxxxx欧美丶| 中文字幕亚洲精品在线观看| 久久不射热爱视频精品| 国产精品不卡一区| 色综合影院在线观看| 91精品91久久久中77777老牛| eeuss影院在线观看| 91福利视频在线| 1024精品视频| 麻豆av一区二区| 国产一区二区在线观看免费播放| 国产福利第一视频| 韩国三级在线看| 欧美日韩免费一区| 久久国产精品亚洲va麻豆| 日韩在线观看你懂的| 中文字幕日本乱码精品影院|