我有一个多线程应用程序。该应用程序具有以下一组线程:
休眠的主线程。所有信号都在该线程中被阻塞。
线程 t1 执行所有处理。所有信号都在该线程中被阻塞。
由我使用的第三方组件设置的信号处理线程 (t2)。该线程仅等待 SIGINT 和 SIGKILL 信号。所有其他信号都在此线程中被阻止。
我自己的自定义信号处理线程 (t3)。
现在,为了处理进程退出,我向我的进程发送了 SIGUSR1。该信号将被线程 t3 捕获。线程 t3 将调用清理例程并退出。这里的问题是线程 t3 尝试清理其他线程访问的资源。这会导致间歇性崩溃。
显然,我目前的解决方案没有优雅的进程退出处理。我的问题是在这种情况下应该如何处理进程退出?信号处理线程应该如何停止剩余线程然后退出进程?
或者有没有比发送信号(SIGUSR1)来终止进程更好的方法?
我的应用程序是用 C 编写的,在 RHEL 5 上运行。
最佳答案
在清理例程中放置一个互斥体,这样两个线程就不会尝试同时清理。想要关闭的线程应该获取互斥体,然后告诉其他线程关闭(无论您通常采用哪种方式)。这样,只有一个线程应该执行实际的清理工作。
void cleanup()
{
pthread_mutex_lock(m);
if (!cleanup_done) {
cleanup_done = 1;
tell_other_threads_to_stop();
wait_for_other_threads_to_finish();
clean_up_common_resources();
}
pthread_mutex_unlock(m);
}
或者,您可以永久锁定所有共享资源,清理它们并在持有锁的同时终止整个进程。
关于c - 处理多线程应用程序中线程内的进程退出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7709672/