linux作業系統之競態條件(時序競態)

2021-08-26 15:26:13 字數 960 閱讀 9811

(1)時序競態:前後兩次執行同乙個程式,出現的結果不同。

(2)pause函式:使用該函式會造成程序主動掛起,並等待訊號喚醒,呼叫該系統呼叫的程序會處於阻塞狀態(主動放棄cpu)

函式原型:int pause(void);  返回值為-1,並設定errno為eintr

使用pause和alarm實現sleep函式;

(3)時序問題分析

1)如果在執行完函式alarm函式呼叫時(還沒有計時完),此時程序失去cpu,進入就緒等待狀態。

2)定時時間到,核心向當前程序傳送sigalrm訊號,訊號無法被處理,訊號處於阻塞等待狀態。

3)當程序再次獲得cpu資源時,sigalrm訊號被遞達,訊號捕捉,執行捕捉函式。

4)捕捉函式結束後,返回當前程序主控流程,pause()被呼叫掛起等待,無法被喚醒。

主要原因:是因為在alarm函式和pause函式之間執行的時間比定時長,導致定時完了還沒執行pause函式。

(4)解決方法:使用sigsuspend函式(在嚴格要求時序的場合下使用)

函式原型:int sigsuspend(const sigset_t *mask)

sigsuspend呼叫期間,程序訊號遮蔽字由引數mask指定。

實現原理:在sigsupend呼叫之前遮蔽該訊號,臨時訊號遮蔽字mask中解遮蔽這個訊號,那麼訊號來的時候在sigsuspend中是將訊號阻塞,在mask中則使用該訊號。

(5)總結

競態條件和系統負載有很緊密的關係,體現出訊號的不可靠性。針對於這種情況,應提早預見,主動規避。             

linux作業系統之條件變數

1 條件變數 條件變數本身不是鎖,但它可以造成執行緒阻塞,通常與互斥鎖配合使用。2 條件鎖相關函式 pthread cond t型別,用於定義條件變數 1 初始化乙個條件變數 pthread cond init int pthread cond init pthread cond t restric...

競態條件的賦值 Go 譯文之競態檢測器 race

譯者前言 第三篇 go 官方部落格譯文,主要是關於 go 內建的競態條件檢測工具。它可以有效地幫助我們檢測併發程式的正確性。使用非常簡單,只需在 go 命令加上 race 選項即可。本文最後介紹了兩個真實場景下的競態案例,第乙個案例相對比較簡單。重點在於第二個案例,這個案例比較難以理解,在原文的基礎...

解決競態問題之原子操作

原子操作簡介 原子操作就是 指不能再進一步分割的操作 一般原子操作用於 整形操作 或者 位操作 假如現在要對無符號整形變數 a 賦值,值為3,對於 c 語言來講很簡單,直接就是 a 3 但是 c 語言要先編譯為成彙編指令,arm 架構不支援直接對暫存器進行讀寫操作,比如 要借助暫存器 r0 r1 等...