这些年来已被问过几次,我只是在检查是否有可接受的解决方案。
对于线程终止,我们使用通过ZFS从Solaris继承的标准Unix方式。所以线程有mutex和condvar,并以:
完成 l2arc_thread_exit = 0;
cv_broadcast(&l2arc_feed_thr_cv);
thread_exit();
}
并且主线程等待;
mutex_enter(&l2arc_feed_thr_lock);
cv_signal(&l2arc_feed_thr_cv); /* kick thread out of startup */
l2arc_thread_exit = 1;
while (l2arc_thread_exit != 0)
cv_wait(&l2arc_feed_thr_cv, &l2arc_feed_thr_lock);
mutex_exit(&l2arc_feed_thr_lock);
相当直截了当地,问题出现在现有的线程信令父节点之间,实际到达thread_exit()
的末尾,并且,父线程完成并且XNU通过释放所有内存来清理kextunload。
当然很少见,但可能会发生。通过在thread_exit()
调用之前添加延迟,可以轻松突出显示。
是的,我可以在主线程完成之前放一个延迟,所以kextunload在线程消失后有更大的机会运行,但最终,能够确保线程实际上已经消失会很好。
互联网已建议调用thread_suspend()
和thread_resume()
,直到返回KERN_TERMINATED为止。但APPLE对于我们实际可以调用的内容有点意思,我们无法链接这些调用。 (好吧,我可以,但没有一个睡眠循环,但是醒来会更好)
那么,有没有聪明的方法来处理这种同步? Apple法律方式?非苹果合法方式?