linux 訊號量是什麼怎麼用?

時間 2021-05-09 12:58:50

1樓:唐浩然

大體相當於「被可睡眠函式使用的自旋鎖」

用來保護共享的資料結構,避免發生共享資料結構被多程序同時讀寫的造成的最終結果誤差問題。

個人覺得,翻譯成「訊號燈」,更容易理解。

剛讀到訊號量,總覺得於訊號「signal」有關,後來發現,毛關係也沒有。

2樓:陳碩

我的建議是不要使用 semaphore。

另外,我同意樓下 @靈劍 指出的,你的書上的例子是錯的,併發訪問 work_area 有 data race。

3樓:靈劍

訊號量就是在乙個叫做互斥區的門口放乙個盒子,盒子裡面裝著固定數量的小球,每個執行緒過來的時候,都從盒子裡面摸走乙個小球,然後去互斥區裡面浪(?),浪開心了出來的時候,再把小球放回盒子裡。如果乙個執行緒走過來一摸盒子,得,乙個球都沒了,不拿球不讓進啊,那就只能站在門口等乙個執行緒出來放回來乙個球,再進去。

這樣由於小球的數量是固定的,那麼互斥區裡面的最大執行緒數量就是固定的,不會出現一下進去太多執行緒把互斥區給擠爆了的情況。這是用訊號量做併發量限制。

另外一些情況下,小球是一次性的,執行緒拿走乙個進了門,就把小球扔掉了,這樣用著用著小球就沒了,不過有另外一些執行緒(一般叫做生產者)會時不時過來往盒子裡再放幾個球,這樣就可以有新的執行緒(一般叫做消費者)進去了,放乙個球進乙個執行緒,這是訊號量做同步功能。你截圖裡的例子就是這個情況,主線程是生產者,通過sem_post往盒子裡放小球(訊號量加一),而其他執行緒是消費者,通過sem_wait從盒子裡拿小球(訊號量減一),如果遇到盒子裡乙個小球都沒有(訊號量為0),就會開始等待訊號量不為0,然後拿走乙個小球(訊號量減一)再繼續。

本質上來說訊號量就是那個盒子,以及「摸不到球就不讓進」這個機制。

順便你這個例子其實有點問題,傳送訊號量也就是放小球的這個過程並不會阻塞,會繼續執行下去,那麼有可能在消費者執行緒取走work_area裡面的資料之前,下乙個fgets就把這個資料覆蓋了,這是個很危險的競爭冒險的問題,非常不符合多執行緒程式的設計準則。由於是從stdin當中讀取資料,一般來說鍵盤是沒有這麼快,但要知道完全可以把輸入重定向到檔案,這時候就很容易出問題了。

全域性靜態變數,互斥訊號量等在記憶體中是怎麼處理?

L1和L2 Cache之間有Coherency protocol的。MESI裡面乙個Cache打算改乙個變數的時候會通知別的Cache,並令後者中的變數副本失效。這樣可以保證所有的Cache都能看到同樣的變數值。針對Mutex這種變數還有額外的硬體實現,來保證在任一時刻最多只有乙個CPU獨佔地對乙個...

CAD是什麼?要怎麼用?

鶴鳴 做圖用的,可以用來搞設計,想學CAD可以報班或者自學。不過個人覺得CAD自學就可以了,畢竟上手不難,直接去b站或者小紅書或者知乎啥的找教程就可以 喃尋 CAD是一款繪圖軟體,它可以繪製複雜的工程圖,而不是簡單的線條或圖示,它的繪圖功能很強大,幾乎無所不能,所以,你如果繪製機械圖 建築圖 電器圖...

用最少的量去描述乙個特徵,這是什麼學科研究的內容?

三文魚 壓縮感知吶。低於奈奎斯特定理進行資訊恢復需要先驗。深度學習可以提供這種先驗。不過這種先驗不確定性還很大。有很大的研究空間。ps,最近深度壓縮深度學習太火了。 自行加聚 面對乙個新的事物,科學將嘗試先使用最概括的方法描述它,將其最明顯的部分表徵出來。當這一基本概括的特徵得到充分的論述後,它會將...