c++ - Pthread 阻塞/可更新计时器

标签 c++ timer pthreads sleep blocking

我目前正在使用 pthreads,并且我的一个线程中有一个 run() 方法。 run() 方法检查 vector 的第一个元素的开始时间,并且需要进行阻塞 sleep 直到到达该时间,以允许其他线程执行。问题是 vector 的前面元素可以更新,我需要在我的 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);

顺便说一句,在我们的测试中,以这种方式休眠和唤醒我们的线程比使用条件变量快很多倍。

关于c++ - Pthread 阻塞/可更新计时器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10525496/

相关文章:

c++ - C# String.Format 与 C++ 中的参数标准等效?

c++ - Microsoft Active Accessibility、VB6 和 Ranorex

wpf - 使用 Storyboard作为计时器有什么意义?

java - Android - 如何在后台运行多个计时器

linux - 抢占式线程与非抢占式线程

c++ - Arduino:在没有编辑库的情况下更改定义[已解决,编译器中的错误,可用的解决方法]

c++ - 生成基本的学校时间表

web-scraping - 在 Nixos 上使用 systemd 计时器运行脚本

c - pthread_join() 中的段错误

c - 线程到多搜索文件