鍍金池/ 問答/C  Linux  網(wǎng)絡(luò)安全/ 在Linux系統(tǒng)下,執(zhí)行sem_timewait(),在等待鎖的期間,當(dāng)前線程會(huì)

在Linux系統(tǒng)下,執(zhí)行sem_timewait(),在等待鎖的期間,當(dāng)前線程會(huì)睡眠還是阻塞

在Linux系統(tǒng)下,執(zhí)行sem_timewait(),在等待鎖的期間,當(dāng)前線程會(huì)睡眠,選擇其它線程執(zhí)行,還是在原地阻塞,直到超時(shí)?

超時(shí)以后,如果還沒獲取到鎖,是睡眠當(dāng)前進(jìn)程,還是阻塞當(dāng)前進(jìn)程?

回答
編輯回答
夢一場

sem_timewait 函數(shù)會(huì)阻塞當(dāng)前線程直到拿到鎖或超時(shí)才會(huì)返回。阻塞的實(shí)現(xiàn)方式就是休眠當(dāng)前線程,直到鎖釋放或者超時(shí)后喚醒。
超時(shí)后這個(gè)函數(shù)返回繼續(xù)執(zhí)行后面的代碼,后面的代碼邏輯決定后面的行為。

休眠是阻塞的一種實(shí)現(xiàn)或者說表現(xiàn)方式,二者不是一個(gè)層面的概念。

2017年11月19日 00:39
編輯回答
執(zhí)念

如果你說的是 sem_timedwait

我印象中,只有自旋鎖會(huì)在原地阻塞,而其他同步機(jī)制都是會(huì)睡眠。

第二個(gè)問題在 man 手冊中有提到,當(dāng)超時(shí)還沒有獲得鎖,函數(shù)會(huì)以 timeout 的錯(cuò)誤失敗返回,errno 會(huì)設(shè)置 ETIMEDOUT

If the timeout has already expired by the time of the call, and the semaphore could not be locked immediately, then sem_timedwait() fails with a timeout error (errno set to ETIMEDOUT).
2018年3月10日 14:52