问题
如果我打电话create_timer
与SIGEV_THREAD
常量存储在sigev_notify
我的领域sigevent
结构,那么当计时器事件发生时,我的sigev_notify_function
回调将被调用。
调用是否有任何隐藏的含义或不良副作用timer_delete
从我的回调函数中?
具体问题
我最初的想法是应该没问题。但是,我并不完全理解在幕后操作的机制,并且我担心如果在处理完成之前删除计时器及其关联结构,是否会正确清理回调的线程并处理信号。
背景
另一位SO用户问这个问题 https://stackoverflow.com/q/29799925/2615940,本质上是说,“我真的需要在调用后删除我的计时器吗?timer_create
?我的回答是响亮的yes。然后他在评论中提出了一个后续问题:“可以从计时器回调函数中执行此操作吗?”我对此没有一个好的答案。
根据sigevent(7) http://man7.org/linux/man-pages/man7/sigevent.7.html,当你使用SIGEV_THREAD
,回调按以下方式执行:
通过调用通知进程sigev_notify_function
“好像”是
新线程的启动函数。 (其中实施
这里的可能性是每个计时器通知都可能导致
创建一个新线程,或者创建一个线程
接收所有通知。)
据您(程序员)所知,您的通知函数正在新线程的上下文中执行,not在中断另一个线程执行的标准信号处理程序例程的上下文中。因此,异步信号安全函数的规则不适用,这与 Basile 的答案中提到的相反,因此您可以在使用时在通知函数中做任何您想做的事情SIGEV_THREAD
与你的计时器。这包括调用timer_delete
删除timer_t
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)