oracle的cv函数,cv_wait 和 cv_timedwait 函数
cv_wait() 和 cv_timedwait() 函數
如果使用 cv_wait(9F) 根據某個條件將線程阻塞,但該條件不發生,則該線程將永遠等待。要避免這種情況,請使用 cv_timedwait(9F),它取決于執行喚醒的其他線程。cv_timedwait() 采取絕對等待時間作為參數。如果時間已到但未發生事件,則 cv_timedwait() 將返回 -1。如果滿足條件,則 cv_timedwait() 將返回一個正值。
cv_timedwait(9F) 要求自上次重新引導系統以來的絕對等待時間(以時鐘周期表示)。通過使用 ddi_get_lbolt(9F) 檢索當前值可確定該等待時間。驅動程序通常具有的是最大等待秒數或微秒數,因此需要使用 drv_usectohz(9F) 將該值轉換為時鐘周期,然后與 ddi_get_lbolt(9F) 的值相加。
以下示例說明如何使用 cv_timedwait(9F) 最多等待五秒鐘便訪問設備,然后向調用方返回 EIO。示例?3-2使用 cv_timedwait()clock_t cur_ticks, to;
mutex_enter(&xsp->mu);
while (xsp->busy) {
cur_ticks = ddi_get_lbolt();
to = cur_ticks + drv_usectohz(5000000); /* 5 seconds from now */
if (cv_timedwait(&xsp->cv, &xsp->mu, to) == -1) {
/*
* The timeout time 'to' was reached without the
* condition being signaled.
*/
/* tidy up and exit */
mutex_exit(&xsp->mu);
return (EIO);
}
}
xsp->busy = 1;
mutex_exit(&xsp->mu);
雖然設備驅動程序寫入器通常首選使用 cv_timedwait(9F) 而不是 cv_wait(9F),但是有時選用 cv_wait(9F) 會更好。例如,如果驅動程序基于以下條件等待,則使用 cv_wait(9F) 更合適:內部驅動程序狀態發生變化,在此情況下狀態變化可能要求執行一些命令或設置要經過的時間
驅動程序的某些部分必須單線程執行
已在管理可能超時的情況,如 "A" 取決于 "B",同時 "B" 使用 cv_timedwait(9F)
總結
以上是生活随笔為你收集整理的oracle的cv函数,cv_wait 和 cv_timedwait 函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle 触发器 upsert,如何
- 下一篇: linux 监控命令free,简单了解L