【问题标题】:Timer in reusable code in a multi-threaded application多线程应用程序中可重用代码中的计时器
【发布时间】:2015-11-14 12:30:56
【问题描述】:

我正在编写一个多线程应用程序。其中一个线程需要定期做一些工作,所以我使用setitimer 设置一个定时器,并在定时器到期时将SIGALRM 发送到进程。

问题是我事先不知道哪个线程会收到信号。

这可以通过为每个线程设置信号掩码来轻松解决,这样只有一个线程可以接收SIGALRM。但这在这种特殊情况下似乎不合适,因为计时器注册在应用程序的模块之一中,该模块也用于其他程序。 (作为一段共享代码。它是某种特殊 USB 设备的通信包装器。)

建议的(和标准的)方法将要求此代码的用户要么

  • 在生成线程时注意问题并正确设置信号掩码,或者
  • 自己设置定时器,并在定时器到期时调用上述模块中的一些特殊处理程序。

这似乎不对。

对于一段可重用的代码需要一个计时器来操作,这可能会干扰程序其余部分的操作,常见的解决方案是什么?

感谢您的任何见解。

【问题讨论】:

  • 你必须使用定时器/SIGALRM吗?您可以在不会对其他模块产生影响或副作用的其他同步上使用 sleep() 循环或定时等待吗?
  • 我几乎可以使用任何我想要的东西,除了忙着等待。您所说的“定时等待其他同步”是什么意思?谢谢!
  • 类似 pthread_cond_timedwait() 或 sem_timedwait() 的东西。隔离、自包含、没有占用 CPU 的忙等待。
  • 请稍等,我去看看。
  • 无论如何都要投赞成票。我讨厌外部影响/依赖。使用线程的一个原因是开发子系统,通过它们自己的执行,我可以直接安装到应用程序上,它们将工作而无需摆弄其他已经工作的东西,我不想改变。

标签: c multithreading unix signals


【解决方案1】:

您可以使用pthread_kill,它可以让您向给定线程发出信号。然后,您可以使用在受控循环中调用 sleeppthread_kill 的守护线程来为给定线程计时。

如果您关心全局进程计时器与睡眠的交互,那么您可以使用usleep(或nanosleep)。

【讨论】:

  • 我认为我不应该在“守护线程”中调用睡眠,因为根据手册页,这可以使用SIGALRM 实现。我会干扰进程的全局状态,这是我首先要避免的。尽管如此,感谢您的帮助。
  • 这解决了我的问题。毕竟它是如此简单。非常感谢,请接受我对巴黎不幸的哀悼。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-06
  • 1970-01-01
  • 1970-01-01
  • 2018-11-20
  • 1970-01-01
  • 1970-01-01
  • 2011-12-10
相关资源
最近更新 更多