如果我在一个进程中有两个线程A和B,并且线程A创建了一个计时器,因为计时器回调可以中断任何一个线程,这是否意味着(在线程和计时器回调之间)对共享对象的访问需要同步?也有人说,定时器回调和应用程序线程之间的同步是不安全的,比如线程A锁定了一个互斥mA,然后被定时器回调中断,在定时器回调中它也试图锁定mA,这时死锁就发生了。我上面的陈述对吗?如果是真的,为了避免同步问题,在定时器回调中有很多限制。
发布于 2017-08-23 16:21:12
与信号相关的问题的最简单解决方案是不异步处理信号。有几种方法可以做到这一点。
首先,如果一个信号到达一个进程组,最好只有一个线程不阻塞该信号。
接下来,精确的解决方案取决于程序的主循环看起来是什么样子。最有可能的是,这是一个围绕select/epoll的循环。如果是这样,请查看pselect和epoll_pwait,并确保您理解他们所说的内容。以这种方式处理信号意味着您的信号处理程序与您的实际程序同步运行,几乎消除了所有的限制。
一种更好的解决方案(但仅适用于Linux )是不使用信号处理程序处理信号,而是使用signalfd将其转换为文件描述符。
最后,但决不是最不重要的,如果你想要的是处理文件描述符+基于计时器的操作,有一些库可以为你将其包装在面向性能的实现中。您还可以在不收取额外费用的情况下获得平台独立性。
两个这样的库是libevent和libev。
https://stackoverflow.com/questions/45833458
复制相似问题