【问题标题】:c++ multithread - Signal processor threadc++ multithread - 信号处理器线程
【发布时间】:2012-06-16 09:47:48
【问题描述】:

http://pubs.opengroup.org/onlinepubs/009604499/functions/sigprocmask.html

文档显示了需要 wait 的所有信号都存储在全局范围变量中的示例(在 main() 在信号线程启动之前填充。 在示例信号线程开始之后 SIG_BLOCK 阻塞信号。

如果我将创建我的信号线程 before SIG_BLOCK 在 main() 阻塞信号然后我将阻塞所有其他的信号,它是否正确并且不会导致一些未定义的行为或崩溃新创建的线程?

【问题讨论】:

    标签: c++ multithreading pthreads signals


    【解决方案1】:

    只要信号线程显式阻塞它最终会用sigwait 等待的信号,那么它就是安全的。

    例如,以下两个流程示例都是安全的:

    main:
      create_signal_thread() // Inherits mask from main, so signals are not blocked.
      block_signals()        
      create_more_threads()  // Inherit mask from main, so signals are blocked.
    
    signal_thread:
      block_signals()        // Must block signals, as this thread will wait on them.
      sigwait()              // Behavior is defined.
    

    main:
      block_signals()        
      create_signal_thread() // Inherits mask from main, so signals are blocked.
      create_more_threads()  // Inherit mask from main, so signals are blocked.
    
    signal_thread:
      sigwait()              // Behavior is defined.
    

    但是,这个例子并不安全:

    main:
      create_signal_thread() // Inherits mask from main, so signals are not blocked.
      block_signals()        
      create_more_threads()  // Inherit mask from main, so signals are blocked.
    
    signal_thread:
      sigwait()              // Behavior is undefined.
    

    这是来自sigwait的相关摘录:

    set 定义的信号将在调用sigwait(); 时被阻塞,否则行为未定义。未指定sigwait() 对集合中信号的信号动作的影响。

    【讨论】:

    • 谢谢,目前,我使用 3 变体,但在调用 sigwait() 之前,我是 sigfillset(&set);,然后才 sigwait(&set, &sig); 似乎,这没关系并且行为已定义?
    • 只要你在sigwait(&set, &sig)之前的信号处理线程中调用pthread_sigmask(SIG_BLOCK, &set, NULL),那么你就不应该观察到未定义的行为。
    • 谢谢,目前我不这样做。我想如果我将阻止signal thread 的所有信号,结果 sigwait 将不会收到任何信号。
    • SIG_BLOCK 阻止信号被传递,直到它后来被解除阻塞,使其处于 pending 状态。 sigwait() 仅对 待处理 信号起作用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-27
    • 1970-01-01
    • 2013-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多