1. 程式人生 > >同樣可以實現互斥,互斥鎖和訊號量有什麼區別?

同樣可以實現互斥,互斥鎖和訊號量有什麼區別?

援引CU上一篇帖子的內容:
“訊號量用在多執行緒多工同步的,一個執行緒完成了某一個動作就通過訊號量告訴別的執行緒,別的執行緒再進行某些動作(大家都在semtake的時候,就阻塞在 哪裡)。而互斥鎖是用在多執行緒多工互斥的,一個執行緒佔用了某一個資源,那麼別的執行緒就無法訪問,直到這個執行緒unlock,其他的執行緒才開始可以利用這 個資源。比如對全域性變數的訪問,有時要加鎖,操作完了,在解鎖。有的時候鎖和訊號量會同時使用的”
也就是說,訊號量不一定是鎖定某一個資源,而是流程上的概念,比如:有A,B兩個執行緒,B執行緒要等A執行緒完成某一任務以後再進行自己下面的步驟,這個任務 並不一定是鎖定某一資源,還可以是進行一些計算或者資料處理之類。而執行緒互斥量則是“鎖住某一資源”的概念,在鎖定期間內,其他執行緒無法對被保護的資料進 行操作。在有些情況下兩者可以互換。

兩者之間的區別:

作用域
訊號量: 程序間或執行緒間(linux僅執行緒間的無名訊號量pthread semaphore)
互斥鎖: 執行緒間

上鎖時
訊號量: 只要訊號量的value大於0,其他執行緒就可以sem_wait成功,成功後訊號量的value減一。若value值不大於0,則sem_wait使得執行緒阻塞,直到sem_post釋放後value值加一,但是sem_wait返回之前還是會將此value值減一
互斥鎖: 只要被鎖住,其他任何執行緒都不可以訪問被保護的資源

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

訊號燈與互斥鎖和條件變數的主要不同在於”燈”的概念,燈亮則意味著資源可用,燈滅則意味著不可用。如果說後兩中同步方式側重於”等待”操作,即資 源不可用的話,訊號燈機制則側重於點燈,即告知資源可用;
沒有等待執行緒的解鎖或激發條件都是沒有意義的,而沒有等待燈亮的執行緒的點燈操作則有效,且能保持 燈亮狀態。當然,這樣的操作原語也意味著更多的開銷。

訊號燈的應用除了燈亮/燈滅這種二元燈以外,也可以採用大於1的燈數,以表示資源數大於1,這時可以稱之為多元燈。

1. 建立和 登出

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

int sem_init(sem_t *sem, int pshared, unsigned int value)
這是建立訊號燈的API,其中value為訊號燈的初值,pshared表示是否為多程序共享而不僅僅是用於一個程序。LinuxThreads沒有實現 多程序共享訊號燈,因此所有非0值的pshared輸入都將使sem_init()返回-1,且置errno為ENOSYS。初始化好的訊號燈由sem變 量表徵,用於以下點燈、滅燈操作。

int sem_destroy(sem_t * sem)
被登出的訊號燈sem要求已沒有執行緒在等待該訊號燈,否則返回-1,且置errno為EBUSY。除此之外,LinuxThreads的訊號燈 登出函式不做其他動作。
sem_destroy destroys a semaphore object, freeing the resources it might hold. No threads should be waiting on the
semaphore at the time sem_destroy is called. In the LinuxThreads implementation, no resources are associated with
semaphore objects, thus sem_destroy actually does nothing except checking that no thread is waiting on the semaphore.

2. 點燈和滅燈

int sem_post(sem_t * sem)

點燈操作將訊號燈值原子地加1,表示增加一個可訪問的資源。

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。

3. 獲取燈值

int sem_getvalue(sem_t * sem, int * sval)

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

4. 其他

sem_wait()被實現為取消點。( 取消點事什麼意思???)
sem_wait is a cancellation point.
取消點的含義:
當用pthread_cancel()一個執行緒時,這個要求會被pending起來,當被cancel的執行緒走到下一個cancellation point時,執行緒才會被真正cancel掉。
而且在支援原子”比較且交換CAS”指令的體系結構上,sem_post()是唯一能用於非同步訊號處理函式的POSIX非同步訊號 安全的API。

On processors supporting atomic compare-and-swap (Intel 486, Pentium and later, Alpha, PowerPC, MIPS II, Motorola 68k),
the sem_post function is async-signal safe and can therefore be called from signal handlers. This is the only thread syn-
chronization function provided by POSIX threads that is async-signal safe.

   On the Intel 386 and the Sparc, the current LinuxThreads implementation of sem_post is not async-signal safe  by  lack  of
   the required atomic operations.

相關推薦

同樣可以實現互斥互斥訊號什麼區別

援引CU上一篇帖子的內容: “訊號量用在多執行緒多工同步的,一個執行緒完成了某一個動作就通過訊號量告訴別的執行緒,別的執行緒再進行某些動作(大家都在semtake的時候,就阻塞在 哪裡)。而互斥鎖是用在多執行緒多工互斥的,一個執行緒佔用了某一個資源,那麼別的執

同樣搞Java年薪15W年薪50W的區別在哪裡?

在這個IT系統動輒就是上億流量的時代,Java作為大資料時代應用最廣泛的語言,誕生了一批又一批的新技術,包括HBase、Hadoop、MQ、Netty、SpringCloud等等 。 一些獨角獸公司以及騰訊、阿里、百度、網易等知名大廠對Java人才的需求量連年升級,有2年工

同樣是合併git mergegit rebase什麼區別

參考部落格 [1]https://www.cnblogs.com/marblemm/p/7161614.html [2]https://blog.csdn.net/liuxiaoheng1992/article/details/79108233 [3]https://blog.csd

自旋互斥訊號

自旋鎖 Linux核心中最常見的鎖是自旋鎖(spin lock)。自旋鎖最多隻能被一個可執行執行緒持有。如果一個執行執行緒試圖獲得一個被已經持有的自旋鎖,那麼該執行緒就會一直進行忙迴圈——旋轉——等待鎖重新可用。要是鎖未被爭用,請求鎖的執行執行緒便能立刻得到它,繼續執行。在任意時間,自旋鎖都

作業系統清華向勇陳渝版筆記(九) 同步協同多道程式設計併發問題同步互斥臨界區

前篇在此: 正文 9-1 同步互斥、臨界區、死鎖、互斥概念等等 多個程序會互動,對共享資源的訪問。處理不當就會飢餓,死鎖。 獨立的執行緒:不和其他執行緒共享資源或狀態,不互動,所以具有確定性(輸入狀態決定結果),可重現(能重現起始條件

PV操作訊號機制實現程序同步(對多個臨界資源的互斥訪問)

          程序同步是我們在多執行緒中討論最多的一個話題,在大多數的開發語言中,他們都有自己實現程序同步的方法或者實現。但歸根結底他們實現的方式都是基於作業系統的程序同步的方式。今天我們就一起來看一下在作業系統這個底層中是怎麼實現程序同步的。在計算機作業系統中,P

將應用程式從 OS/2 移植到 Linux 上: 第 1 部分執行緒、互斥訊號

級別: 初級 2004 年 4 月 01 日 Linux 是新千年裡最傑出的作業系統,而傳統的作業系統,如 OS/2,現在正在逐漸淘汰出局。本系列文章是為那些正經受移植痛苦的開發人員撰寫的,可以幫助他們

VxWorks 二進位制訊號互斥訊號計數訊號區別

URL: http://blog.csdn.net/hxg130435477/article/details/5998006 VxWorks訊號量是提供任務間通訊、同步和互斥的最優選擇,提供任務間最快速的通訊。也是提供任務間同步和互斥的主要手段。VxWorks提供3種訊號

【Qt開發】QThread中的互斥、讀寫訊號、條件變數

在gemfield的《從pthread到QThread》一文中我們瞭解了執行緒的基本使用,但是有一大部分的內容當時說要放到這片文章裡討論,那就是執行緒的同步問題。關於這個問題,gemfield在《從進 程到執行緒》中有一個比喻,有必要重新放在下面溫習下: ***************

互斥訊號的作用與區別

“訊號量用在多執行緒多工同步的,一個執行緒完成了某一個動作就通過訊號量告訴別的執行緒,別的執行緒再進行某些動作(大家都在semtake的時候,就阻塞在 哪裡)。而互斥鎖是用在多執行緒多工互斥的,一個執行緒佔用了某一個資源,那麼別的執行緒就無法訪問,直到這個執行緒unlock,

Python之路(第三十八篇) 併發程式設計:程序同步/互斥訊號、事件、佇列、生產者消費者模型

一、程序鎖(同步鎖/互斥鎖) 程序之間資料不共享,但是共享同一套檔案系統,所以訪問同一個檔案,或同一個列印終端,是沒有問題的, 而共享帶來的是競爭,競爭帶來的結果就是錯亂,如何控制,就是加鎖處理。 例子 #併發執行,效率高,但競爭同一列印終端,帶來了列印錯亂 from multiproc

[Linux]互斥機制(中斷遮蔽、原子操作、自旋訊號

基本概念 臨界區 對某段程式碼而言,可能會在程式中多次被執行,每次執行的過程我們稱作程式碼的執行路徑。 當兩個或多個程式碼路徑要競爭共同的資源的時候,該程式碼段就是臨界區。 互斥機制 訪問共享資源的程式碼叫做臨界區。共享資源被多個執行緒需要

互斥訊號的理解

互斥量(Mutex)   互斥量表現互斥現象的資料結構,也被當作二元訊號燈。一個互斥基本上是一個多工敏感的二元訊號,它能用作同步多工的行為,它常用作保護從中斷來的臨界段程式碼並且在共享同步使用的資源。   Mutex本質上說就是一把鎖,提供對資源的獨佔訪問,

C/C++多執行緒、執行緒同步(互斥訊號

參考連結2.中寫的非常好,簡單易懂,上手快,非常好的博文。使用多執行緒及互斥鎖樣例:#include <iostream> #include <windows.h> using namespace std; HANDLE hMutex = NULL;

面試筆記(一):系統程式設計(執行緒同步——互斥、讀寫訊號、條件變數)

1.linux下執行緒同步的方式(轉自:https://blog.csdn.net/Shannon_ying/article/details/51280623、https://blog.csdn.net/q_l_s/article/details/44117929)執行緒的最

互斥體、原子操作、自旋訊號

一、互斥體 struct mutex my_mutex;//定義mutex mutex_init(&my_mutex);//初始化mutex mutex_lock(&my_mutex);//獲取mutex ... //臨界資源 mutex_unlock(&

互斥、死、遞迴訊號、Event

互斥鎖 互斥鎖也叫使用者鎖、同步鎖。 在多程序/多執行緒程式中,當多個執行緒處理一個公共資料時,會有資料安全問題,唯一能保證資料安全的,就是通過加鎖的方式,同一時間只能有一個修改資料的操作,將處理資料變為序列。雖然犧牲了速度,但是保證了資料安全。 來

執行緒同步(互斥訊號的作用與區別

“訊號量用在多執行緒多工同步的,一個執行緒完成了某一個動作就通過訊號量告訴別的執行緒,別的執行緒再進行某些動作(大家都在semtake的時候,就阻塞在 哪裡)。而互斥鎖是用在多執行緒多工互斥的,一個執行緒佔用了某一個資源,那麼別的執行緒就無法訪問,直到這個執行緒unloc

互斥訊號

1. 互斥量用於執行緒的互斥,訊號量用於執行緒的同步。 這是互斥量和訊號量的根本區別,也就是互斥和同步之間的區別。

圖解程序執行緒、互斥訊號-看完不懂你來打我

![](https://img2020.cnblogs.com/other/1815316/202009/1815316-20200906085125268-309001835.png) 在上學的時候,老師講到程序與執行緒的時候可能是這樣講的: * 程序是一個具有一定獨立功能的程式在一個數據集上的一次動態