【发布时间】:2015-11-14 12:30:56
【问题描述】:
我正在编写一个多线程应用程序。其中一个线程需要定期做一些工作,所以我使用setitimer 设置一个定时器,并在定时器到期时将SIGALRM 发送到进程。
问题是我事先不知道哪个线程会收到信号。
这可以通过为每个线程设置信号掩码来轻松解决,这样只有一个线程可以接收SIGALRM。但这在这种特殊情况下似乎不合适,因为计时器注册在应用程序的模块之一中,该模块也用于其他程序。 (作为一段共享代码。它是某种特殊 USB 设备的通信包装器。)
建议的(和标准的)方法将要求此代码的用户要么
- 在生成线程时注意问题并正确设置信号掩码,或者
- 自己设置定时器,并在定时器到期时调用上述模块中的一些特殊处理程序。
这似乎不对。
对于一段可重用的代码需要一个计时器来操作,这可能会干扰程序其余部分的操作,常见的解决方案是什么?
感谢您的任何见解。
【问题讨论】:
-
你必须使用定时器/SIGALRM吗?您可以在不会对其他模块产生影响或副作用的其他同步上使用 sleep() 循环或定时等待吗?
-
我几乎可以使用任何我想要的东西,除了忙着等待。您所说的“定时等待其他同步”是什么意思?谢谢!
-
类似 pthread_cond_timedwait() 或 sem_timedwait() 的东西。隔离、自包含、没有占用 CPU 的忙等待。
-
请稍等,我去看看。
-
无论如何都要投赞成票。我讨厌外部影响/依赖。使用线程的一个原因是开发子系统,通过它们自己的执行,我可以直接安装到应用程序上,它们将工作而无需摆弄其他已经工作的东西,我不想改变。
标签: c multithreading unix signals