c - 处理多线程应用程序中线程内的进程退出

标签 c linux multithreading

我有一个多线程应用程序。该应用程序具有以下一组线程:

  1. 休眠的主线程。所有信号都在该线程中被阻塞。

  2. 线程 t1 执行所有处理。所有信号都在该线程中被阻塞。

  3. 由我使用的第三方组件设置的信号处理线程 (t2)。该线程仅等待 SIGINT 和 SIGKILL 信号。所有其他信号都在此线程中被阻止。

  4. 我自己的自定义信号处理线程 (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/

相关文章:

c - 可变参数函数调用如何工作

c - 如何在 MPI 中使用未阻塞的 Bcast?

linux - 如何更改Linux中的权限模式?

linux - Wordpress 本地主机插件安装

c++ - debian 和 std::thread c++ 的即时段错误

ios - 了解大中央调度

c - 使两个结构相等但想要更改其中一个字段

c - 通过包含它的头来使用来自另一个 c 文件的函数

java - 线程不同时运行

c++ - 为什么使用 mktime 处理指针和非指针时 difftime() 会产生不同的结果?