[英]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.