c ++ multithread - 信号处理器线程

时间:2012-06-16 09:47:49

标签: c++ multithreading pthreads signals

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

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

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

1 个答案:

答案 0 :(得分: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()对集合中信号的信号动作的影响未指定。