簡體   English   中英

Pthread阻塞/可更新計時器

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM