如果我在进程中有两个线程A和B,并且线程A创建了一个计时器,由于计时器回调可以中断任一线程,这是否意味着需要访问共享对象(在线程和计时器回调之间)同步? 还有人说,定时器回调和应用程序线程之间的同步是不安全的,比如,线程A锁定了互斥量mA,然后被定时器回调中断,在定时器回调中它也试图锁定mA,现在发生死锁。 我在上述声明中是对的吗?如果是,则定时器回调有很多限制以避免同步问题。
答案 0 :(得分:0)
信号相关问题的最简单解决方案,例如您带来的问题,是不能异步处理信号。有几种方法可以做到这一点。
首先,如果信号到达进程组,最好只有一个线程不阻塞信号。
接下来,精确的解决方案取决于程序的主循环的样子。最有可能的是,这是select
/ epoll
周围的循环。如果是这样,请查看pselect
和epoll_pwait
,并确保了解他们的意见。以这种方式处理信号意味着您的信号处理程序与您的实际程序同步运行,从中删除几乎所有限制。
更好的解决方案(但仅限于Linux)是使用信号处理程序处理信号,而是使用signalfd
将其转换为文件描述符。
最后,但绝不是最不重要的,如果你想要的只是处理文件描述符+基于计时器的动作,那么有一些库可以在面向性能的实现中为你包装它。您还可以免费获得平台独立性。
两个此类库是libevent
和libev
。