12 競態條件 時序競態

2021-08-25 08:23:33 字數 1096 閱讀 7740

/*

sleep函式幾點說明

1)sleep函式作用,讓程序睡眠。

2)能被訊號打斷,然後處理訊號函式以後,就不再睡眠了。直接向下執行**

3)sleep函式的返回值,是剩餘的秒數

*/

//sleep是可被中斷的睡眠,但不一定睡夠100s

//sleep是可中斷的睡眠

void handler(int num)

}#if 1

void test()

#endif

//利用sleep()函式的返回值使程式足夠的睡眠

#if 0

void test()

else

} while(n > 0);

printf("sleep ....結束\n");

}#endif

int main(void)

/*

使用自定義的sleep1()與真正的sleep()的實現。

但會有3 個問題:

1)在sleep1()之前呼叫alarm

2)程式修改了sigalrm訊號的預設行為

3)alarm()與pause()之間有競爭條件,若alarm()在呼叫pause之前超時

,並呼叫了訊號處理程式,此時呼叫pause後,因沒有捕捉到其他訊號處理函式

,造成函式永久被掛起

解決辦法參考apue 339頁

*/#if 1

void sig_alrm(int signo)

unsigned

int sleep1(unsigned

int seconds)

printf("set seconds = %d, but 返回值是 %d\n",seconds, alarm(seconds));//開始定時器

pause();//主動掛起

return (alarm(0));//關閉定時器,返回剩餘的時間

}void test()

#endif

int main(void)

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

1 時序競態 前後兩次執行同乙個程式,出現的結果不同。2 pause函式 使用該函式會造成程序主動掛起,並等待訊號喚醒,呼叫該系統呼叫的程序會處於阻塞狀態 主動放棄cpu 函式原型 int pause void 返回值為 1,並設定errno為eintr 使用pause和alarm實現sleep函式...

什麼是競態條件

1 什麼是競態條件?當兩個執行緒競爭同一資源時,如果對資源的訪問順序敏感,就稱存在競態條件。導致競態條件發生的 區稱作臨界區。在臨界區中使用適當的同步就可以避免競態條件。臨界區實現方法有兩種,一種是用synchronized,一種是用lock顯式鎖實現。2 例項 class counter 觀察執行...

競態條件與臨界區

在同一程式中執行多個執行緒本身不會導致問題,問題在於多個執行緒訪問了相同的資源。如,同一記憶體區 變數,陣列,或物件 系統 資料庫,web services等 或檔案。實際上,這些問題只有在一或多個執行緒向這些資源做了寫操作時才有可能發生,只要資源沒有發生變化,多個執行緒讀取相同的資源就是安全的。多...