互斥鎖、條件變量、信號量淺析

互斥鎖、條件變量、信號量淺析

互斥鎖與條件變量

  1. 條件變量是為了保證同步 條件變量用在多線程多任務同步的,一個線程完成了某一個動作就通過條件變量告訴別的線程,別的線程再進行某些動作(大家都在semtake的時候,就阻塞在哪里)。信號量可以看作是有計數的條件變量。
  2. 互斥鎖是為了保證互斥 互斥鎖是用在多線程多任務互斥的,一個線程占用了某一個資源,那么別的線程就無法訪問,直到這個線程unlock,其他的線程才開始可以利用這個資源。比如對全局變量的訪問,有時要加鎖,操作完了,再解鎖。互斥鎖可以看作是二值信號量。
  3. 有的時候互斥鎖和條件變量會同時使用的 條件變量通過允許線程阻塞和等待另一個線程發送信號的方法彌補了互斥鎖的不足。在發送信號時,如果沒有線程等待在該條件變量上,那么信號將丟失。

信號量

簡介

信號量可以看作是互斥鎖和條件變量的結合,而互斥鎖和條件變量則可以看作是信號量的一種特殊形式

信號量:只要信號量的value大于0,其他線程就可以sem_wait成功,成功后信號量的value減一。若value值不大于0,則sem_wait阻塞,直到sem_post釋放后value值加1。

以下是信號燈(量)的一些概念:

  1. 信號燈與互斥鎖和條件變量的主要不同在于”燈”的概念,燈亮則意味著資源可用,燈滅則意味著不可用。如果說后兩中同步方式側重于**”等待”操作,即資源不可用的話,信號燈機制則側重于"點燈"**,即告知資源可用;
  2. 沒有等待線程的解鎖或激發條件都是沒有意義的,而沒有等待燈亮的線程的點燈操作則有效,且能保持燈亮狀態。
  3. 信號燈的應用除了燈亮/燈滅這種二元燈以外,也可以采用大于1的燈數,以表示資源數大于1,這時可以稱之為多元燈。

信號燈(量)API

創建和注銷

POSIX信號燈標準定義了有名信號燈和無名信號燈兩種,但LinuxThreads的實現僅有無名燈,同時有名燈除了總是可用于多進程之間以外,在使用上與無名燈并沒有很大的區別,因此下面僅就無名燈進行討論。

  1. 創建

    int sem_init(sem_t *sem, int pshared, unsigned int value)

    這是創建信號燈的API,其中value為信號燈的初值,pshared表示是否為多進程共享而不僅僅是用于一個進程。LinuxThreads沒有實現多進程共享信號燈,因此所有非0值的pshared輸入都將使sem_init()返回-1,且置errnoENOSYS。初始化好的信號燈由sem變量表征,用于以下點燈、滅燈操作。

  2. int sem_destroy(sem_t * sem)

    被注銷的信號燈sem要求已沒有線程在等待該信號燈,否則返回-1,且置errnoEBUSY。除此之外,LinuxThreads的信號燈注銷函數不做其他動作。

點燈和滅燈

  1. 點燈

    int sem_post(sem_t * sem)

    點燈操作將信號燈值原子地加1,表示增加一個可訪問的資源,sem_post()是唯一能用于異步信號處理函數的POSIX異步信號安全的API。

  2. 滅燈

    int sem_wait(sem_t * sem)
    int sem_trywait(sem_t * sem)

    sem_wait()為等待燈亮操作,等待燈亮(信號燈值大于0),然后將信號燈原子地減1,并返回。sem_trywait()sem_wait()的非阻塞版,如果信號燈計數大于0,則原子地減1并返回0,否則立即返回-1,errno置為EAGAIN

獲取燈值

int sem_getvalue(sem_t * sem, int * sval)

讀取sem中的燈計數,存于*sval中,并返回0。

辨析拾遺

  1. 互斥鎖必須是誰上鎖就由誰來解鎖,而信號量的wait和post操作不必由同一個線程執行。
  2. 互斥鎖是為上鎖而優化的;條件變量是為等待而優化的; 信號量既可用于上鎖,也可用于等待,因此會有更多的開銷和更高的復雜性。
  3. 互斥鎖,條件變量都只用于同一個進程的各線程間,而信號量(有名信號量)可用于不同進程間的同步。當信號量用于進程間同步時,要求信號量建立在共享內存區。
  4. 信號量有計數值,每次信號量post操作都會被記錄,而條件變量在發送信號時,如果沒有線程在等待該條件變量,那么信號將丟失。

Ref:

http://blog.chinaunix.net/uid-20671208-id-4935154.html

http://blog.chinaunix.net/uid-23061624-id-79936.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/532762.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/532762.shtml
英文地址,請注明出處:http://en.pswp.cn/news/532762.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

xpwifi熱點設置android,教你在XP電腦中開啟設置WiFi熱點使用的步驟

對于系統中網絡的連接問題是最重要的,那在處理不同的錯誤的情況中,對于無線網絡的設置也就是我們說的WiFi的使用也是會遇到問題的,那在操作的時候對于電腦中是怎么實現設置WiFi熱點的的,對于這個問題今天小編就來跟大家分享一下教…

C/C++ 指針詳解

指針詳解 參考視頻:https://www.bilibili.com/video/BV1bo4y1Z7xf/,感謝Bilibilifengmuzi2003的搬運翻譯及后續勘誤,也感謝已故原作者Harsha Suryanarayana的講解,RIP。 學習完之后,回看找特定的知識點,善…

android雙聯動列表,Android Fragment實現列表和內容聯動

在平板上經常能看到這種的情況:左邊是一個列表,右邊是列表項對應的內容,當點擊某一個列表時,右邊內容區也會隨之改變。下面使用fragment簡單的demo:思路:在mainactivity定義一個回調接口,并在列…

linux /proc 詳解

linux /proc 詳解 本文整理了一下 linux /proc下的幾個常用的目錄和文件,可供查閱,之后在學習工作中有別的用到的話會再補充。 /proc 簡介 Linux系統上的/proc目錄是一種文件系統,即proc文件系統。與其它常見的文件系統不同的是&#xff0…

android模擬器太卡,安卓模擬器安裝之后太卡怎么解決

用安卓模擬器玩游戲原理就是在電腦上安裝了一部手機,如果你的電腦配置不是非常高,能不卡頓嗎?遇到卡頓怎么解決?1、安裝最新版本的顯卡驅動。逍遙模擬器對于顯卡的性能要求很高,因此升級至最新版本的顯卡驅動,是確保逍遙模擬器流…

編程環境中Runtime(運行時)的三個含義

編程環境中Runtime(運行時)的三個含義 轉自:https://www.zhihu.com/question/20607178 知乎答主doodlewind 三個含義 實際上編程語境中的 runtime 至少有三個含義,分別是: 指「程序運行的時候」,即程序…

非常不錯的一款html5【404頁面】,不含js腳本可以左右擺動,原生JavaScript實現日歷功能代碼實例(無引用Jq)...

這篇文章主要介紹了原生JavaScript實現日歷功能代碼實例(無引用Jq),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下成品顯示,可左右切換月份html 代碼移動端日歷日一二三四五六css代碼*{margin: 0;pa…

12 [虛擬化] 進程抽象;fork,execve,exit

12 [虛擬化] 進程抽象;fork,execve,exit 南京大學操作系統課蔣炎巖老師網絡課程筆記。 視頻:https://www.bilibili.com/video/BV1N741177F5?p12 講義:http://jyywiki.cn/OS/2021/slides/8.slides#/ 本講概述 回到“…

計算機應用與基礎實踐怎么考,自考計算機基礎應用科目筆試和實踐性考試怎么考...

自考計算機基礎應用科目筆試和實踐性考試怎么考? 報考自考的考生有些專業的考生會在自己的課程科目中發現計算機基礎應用不僅有理論知識考試還有實踐性考試,那么自考計算機基礎應用科目的筆試和實踐性考試怎么考?自考計算機基礎應用科目筆試怎…

14 [虛擬化] 虛存抽象;Linux進程的地址空間

14 [虛擬化] 虛存抽象;Linux進程的地址空間 南京大學操作系統課蔣炎巖老師網絡課程筆記。 視頻:https://www.bilibili.com/video/BV1N741177F5?p14 講義:http://jyywiki.cn/OS/2021/slides/10.slides#/ 本講概述 程序 狀態機;…

瀏覽器是指在用戶計算機上,自考《網頁設計與制作》測試題及答案

自考《網頁設計與制作》測試題及答案學習是一個不斷積累的過程,為幫助考生們更好地復習《與制作》科目知識點,以下是搜索整理的一份自考《網頁設計與制作》測試題及答案,供參考練習,希望對大家有所幫助!想了解更多相關信息請持續關…

Ubuntu 18.04 安裝OpenCV C++

Ubuntu 18.04 安裝OpenCV C 構建并安裝 僅構建核心模塊 # 更新并安裝依賴 # 更新并安裝依賴 sudo apt update && sudo apt install -y cmake g wget unzip# 下載并解壓包 wget -O opencv.zip https://github.com/opencv/opencv/archive/master.zip unzip opencv.zip…

html計算x的y,HTML5畫布:旋轉時計算x,y點

我開發了一個HTML5 Canvas應用程序,它涉及到讀取一個xml文件,該文件描述了需要在畫布上繪制的箭頭,直形和其他形狀的位置。的XML布局的HTML5畫布:旋轉時計算x,y點實施例:如果對象被旋轉它涉及計算一個點的位…

(2021) 20 [虛擬化] 進程調度

(2021) 20 [虛擬化] 進程調度 南京大學操作系統課蔣炎巖老師網絡課程筆記。 視頻:https://www.bilibili.com/video/BV1HN41197Ko?p20 講義:http://jyywiki.cn/OS/2021/slides/11.slides#/ 背景 — 機制與策略分離 機制:一個通用的、可定制…

計算機組裝過程英文版,計算機組裝與維護試題及答案(國外英文資料).doc

計算機組裝與維護試題及答案(國外英文資料)計算機組裝與維護試題及答案(國外英文資料)(1) choiceIn the following equipment, the input device is (b)A. b. b. c. c. c. d. d.In Windows 98, the combination of CTRL Alt Del is (c)A. cold start b. heat start c. interr…

make命令及makefile

make命令及makefile 轉自:https://www.ruanyifeng.com/blog/2015/02/make.html Make 命令教程 作者: 阮一峰 日期: 2015年2月20日 代碼變成可執行文件,叫做編譯(compile);先編譯這個&#…

局域網中計算機網絡密碼查看,Win10怎么查看電腦上已知的wifi網絡密碼

方法一:網絡和共享中心查詢1、在Windows 10桌面最左下角的【Windwos開始圖標上右鍵】,在彈出的菜單中點擊打開【網絡連接】,如下圖所示。2、在打開的網絡連接設置中,雙擊已經連接的【無線網絡名稱】,在彈出的【WLAN狀態…

(2021) 22 [持久化] 1-Bit的存儲

(2021) 22 [持久化] 1-Bit的存儲 南京大學操作系統課蔣炎巖老師網絡課程筆記。 視頻:https://www.bilibili.com/video/BV1HN41197Ko?p22 講義:http://jyywiki.cn/OS/2021/slides/12.slides#/ 背景 回顧 操作系統是什么?一組對象 一組API…

計算機一級試題論述,計算機一級考試理論題及答案要點

計算機一級考試IT1必做題[1]. 著名的計算機科學家尼.沃思提出了________。A.數據結構+算法程序B.存儲控制結構C.信息熵D.控制論[2]. 下面有關掃描儀的敘述中,錯誤的是________。A.分辨率是掃描儀…

(2021) 23 [持久化] I/O設備與驅動

(2021) 23 [持久化] I/O設備與驅動 南京大學操作系統課蔣炎巖老師網絡課程筆記。 視頻:https://www.bilibili.com/video/BV1HN41197Ko?p23 講義:http://jyywiki.cn/OS/2021/slides/13.slides#/ 背景 很多人 (你們的同學們、家長們) 都有一個認識&…