簡體   English   中英

C ++多線程-信號處理器線程

[英]c++ multithread - Signal processor thread

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

文檔顯示了示例,其中所有需要wait信號都存儲在全局作用域變量中( 信號線程啟動之前填充在main()中。在示例信號線程之后, SIG_BLOCK阻塞了信號)。

如果我將 SIG_BLOCK在main()處阻塞信號之前創建我的信號線程,然后為所有其他新創建的線程阻塞信號,這是否正確並且不會導致某些不確定的行為或崩潰?

只要信號線程顯式阻止信號,它最終將使用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(); 否則,行為是不確定的。 sigwait()對set中的信號的信號動作的影響未指定。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM