事件队列清理
Event queue cleanup
在我的 Tcl 扩展中,辅助线程正在用事件填充 Tcl 事件队列;这些事件包含指向具有动态生命周期的结构的指针。
确保事件队列中没有带有指向已释放结构的悬空指针的事件的正确策略是什么?我可以阻止辅助线程创建新事件;目前我在循环中调用 Tcl_DoOneEvent(TCL_DONTWAIT)
直到它 returns 0(即,事件队列为空)在确保不能创建新事件之后和取消分配结构之前。
这样做正确吗?
在相关说明中,我不确定 Tcl_ThreadAlert()
的目的:如果每次调用 Tcl_ThreadQueueEvent()
后都需要这样做,为什么 Tcl_ThreadQueueEvent()
中不包含警报?
最后,我的代码没有调用 Tcl_CreateEventSource()
,因为它似乎不需要设置,也不需要检查过程,因为涉及第二个线程。这值得关注吗?
关于第一点,我觉得没问题。很像TCL级别的运行update
我不确定第二点,因为它不是我探索过很多的 API 的一部分。这可能是允许每个通知安排多个事件的方式,或者因为调用还有其他用途,但我真的不知道。
第三点,听起来不错。我认为您永远不需要特殊的事件源来进行线程间消息传递。
在我的 Tcl 扩展中,辅助线程正在用事件填充 Tcl 事件队列;这些事件包含指向具有动态生命周期的结构的指针。
确保事件队列中没有带有指向已释放结构的悬空指针的事件的正确策略是什么?我可以阻止辅助线程创建新事件;目前我在循环中调用 Tcl_DoOneEvent(TCL_DONTWAIT)
直到它 returns 0(即,事件队列为空)在确保不能创建新事件之后和取消分配结构之前。
这样做正确吗?
在相关说明中,我不确定 Tcl_ThreadAlert()
的目的:如果每次调用 Tcl_ThreadQueueEvent()
后都需要这样做,为什么 Tcl_ThreadQueueEvent()
中不包含警报?
最后,我的代码没有调用 Tcl_CreateEventSource()
,因为它似乎不需要设置,也不需要检查过程,因为涉及第二个线程。这值得关注吗?
关于第一点,我觉得没问题。很像TCL级别的运行update
我不确定第二点,因为它不是我探索过很多的 API 的一部分。这可能是允许每个通知安排多个事件的方式,或者因为调用还有其他用途,但我真的不知道。
第三点,听起来不错。我认为您永远不需要特殊的事件源来进行线程间消息传递。