繁体   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