【问题标题】:signal handler in a thread线程中的信号处理程序
【发布时间】:2011-05-19 10:33:37
【问题描述】:

我正在编写一个多线程程序,我有一个问题: 假设,在主线程中执行时,我想终止所有 子线程。我不能只向他们发送终止信号,因为我想要他们 首先释放动态分配的内存。我可以定义一个特定的信号处理程序吗 执行的每个线程函数中的函数,该函数又将调用 我将为此编写一个清理函数?如果不是,我怎样才能实现我的目标??

谢谢, 尼科斯

【问题讨论】:

    标签: c linux pthreads signals


    【解决方案1】:

    查看pthread_cancel 的手册页:

    当取消请求被执行时,以下步骤发生 线程(按此顺序):

       1. Cancellation clean-up handlers are popped (in the reverse of the order in
          which they were pushed) and called.  (See pthread_cleanup_push(3).)
    
       2. Thread-specific data destructors are called, in an unspecified order.  (See
          pthread_key_create(3).)
    
       3. The thread is terminated.  (See pthread_exit(3).)
    

    所以你可以在你的 main 中使用pthread_cancel,前提是你已经使用上述函数正确注册了你的清理处理程序。

    (请完整阅读该手册页,其中包含很多重要信息。)

    编辑:(来自 cmets)如果您打算使用 PTHREAD_CANCEL_DEFERRED 并需要在代码中的某处插入取消点,请使用 pthread_testcancel。此函数检查是否请求取消。如果是这种情况,则取消服务(即该调用永远不会返回)。否则无效。

    【讨论】:

    • 这是一个很好的解决方案。我自己用过,设计很整洁。
    • 感谢您的回答!我正在考虑使用 pthread_cleanup_push 和适当的退出处理程序函数来释放所有内容。如果我设置 PTHREAD_CANCEL_DEFERRED 将 sleep(0) 作为取消点是否有效,所以我不会有任何开销?
    • @nikos:这不是最好的方法。使用pthread_testcancel,这正是它的用途。 sleep 可以用信号实现,而sleep(0) 不保证不休眠——唯一的保证是它会休眠至少 0 秒。
    【解决方案2】:

    最强大的策略需要子线程的合作:您设置一个线程定期检查的标志,并在设置标志时释放它们正在使用的任何资源,然后终止。

    【讨论】:

    • periodically check a variable 当然是use a pthread condition variable 的简写——<whistle/>
    • 如果线程可能在阻塞/休眠系统调用上被长期或永久阻塞,这是不可能的。这就是存在取消的原因。
    【解决方案3】:

    取消(Mat 的回答)是正确且规范的,但如果您想要一种不同的方法,您可以使用不带 SA_RESTART 标志的 sigaction 安装无操作信号处理程序,并将 pthread_kill 与任何信号一起使用您选择的号码以中断 (EINTR) 无论线程可能已被阻止。结合这一点,aix 的回答很有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-21
      • 1970-01-01
      • 1970-01-01
      • 2015-09-16
      • 2012-01-24
      • 2011-11-18
      • 2014-08-29
      • 1970-01-01
      相关资源
      最近更新 更多