[英]Pthread blocking / updatable timer
我當前正在使用pthreads,我的一個線程中有一個run()方法。 run()方法檢查向量的第一個元素的開始時間,並且需要進行阻塞睡眠,直到達到該時間為止,從而允許其他線程執行。 問題在於向量的前元素可以更新,因此我需要在run()方法中重置計時器。 我不確定如何解決這個問題。 我無法使用sleep,因為它將一直等到上次檢查的開始時間(可能已更新為更早的時間)。
您可以使用pthread_kill()喚醒在sigtimedwait()處休眠的特定線程。
sigset_t _fSigMask; // global sigmask
我們在創建線程之前執行此操作。 線程從創建它們的線程繼承其信號掩碼。 我們使用SIGUSR1發出線程信號。 其他信號可用。
sigemptyset(&_fSigMask);
sigaddset(&_fSigMask, SIGUSR1);
sigaddset(&_fSigMask, SIGSEGV);
然后睡覺一個線程:
int nSig;
struct timespec tmTimeout = { nSec, nNanoSec }; // from your vector of times
sigtimedwait(&fSigMask, &nSig, &tmTimeout);
然后喚醒線程pThread,只需發出信號:
pthread_kill(pThread, SIGUSR1);
順便說一下,在我們的測試過程中,以這種方式休眠和喚醒線程比使用條件變量快許多倍。
無論更新向量如何,都將需要以一種或另一種方式向睡眠線程發送信號。 有十多種方法可以執行此操作,但是兩個明顯的方法是條件變量,或者僅在管道或類似對象上使用select。
通過條件變量,可以將pthread_cond_timedwait
與計算出的超時值一起使用。 如果超時,可以。 如果收到信號,則必須讀取向量,重新計算超時,然后再次阻塞。
與select()
類似,您可以在等待超時或管道上的某些輸入的同時,從向量和塊中計算並使用超時值。 無論更新向量是什么,都會向管道中寫入一些內容,並且線程將喚醒,重新計算等等。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.