by:
潘雲登
對於商業目的下對本文的任何行為需經作者同意。
寫在前面
1.本文內容對應《
unix
環境高階程式設計》(第
2版)》第
12章。 2.
總結了如何設定執行緒的訊號遮蔽字,以及如何使用專用線程進行訊號處理。 3.
執行緒的訊號遮蔽字
每個執行緒都有自己的執行緒遮蔽字,但是訊號處理函式是程序中所有執行緒共享的。這意味著儘管單個執行緒可以阻止某些訊號,但當執行緒修改了與某個訊號相關的處理行為後,所有的執行緒都必須共享這個處理行為的改變。
程序中的訊號是遞送到單個執行緒的。如果訊號與硬體故障或定時器超時相關,該訊號就被傳送到引起該事件的執行緒中去,而其它的訊號則被傳送到任意乙個執行緒。但要注意,鬧鐘定時器是程序資源,並且所有的執行緒共享相同的
alarm
,所以程序中的多個執行緒不可能互不干擾地使用鬧鐘定時器。
執行緒必須使用
pthread_sigmask
函式,替代程序使用的
sigprocmask
,為自己設定訊號遮蔽字。兩個函式的區別在於,
pthread_sigmask
函式在失敗時返回錯誤碼,而不像
sigprocmask
那樣設定
errno
並返回-1。
#include
int pthread_sigmask(int how, const sigset_t *restrict set, sigset_t *restrict oset);
return: 0 if ok, error number on failure
sigwait
執行緒可以通過呼叫
sigwait
等待乙個或多個訊號發生。
set引數指出了執行緒等待的訊號集,
signop
指向的整數表明接收到的訊號值。如果訊號集中的某個訊號在
sigwait
呼叫的時候處於未決狀態,那麼
sigwait
將無阻塞地返回,在返回之前,
sigwait
將從程序中移除那些處於未決狀態的訊號。
#include
int sigwait(const sigset_t *restrict set, int *restrict signop);
return: 0 if ok, error number on failure
為了避免錯誤動作發生,執行緒在呼叫
sigwait
之前,必須阻塞那些它正在等待的訊號。
sigwait
函式會自動取消訊號集的阻塞狀態,直到有新的訊號被傳遞。在返回之前,
sigwait
將恢復執行緒的訊號遮蔽字,這與
sigsuspend
函式類似。如果訊號在
sigwait
呼叫的時候沒有被阻塞,在完成對
sigwait
sigwait
呼叫之前就被遞送了。 使用
sigwait
的好處在於它可以簡化訊號處理,允許把非同步產生的訊號用同步的方式處理。為了防止訊號中斷執行緒,可以把訊號
加到每個執行緒的訊號遮蔽字中,然後安排專用線程作訊號處理。這個專用線程可以進行任何函式呼叫,不需要擔心在訊號處理函式中呼叫哪些函式是可重入的,因為這些函式呼叫來自正常的執行緒環境,能夠知道在何處被中斷並繼續執行。
範例程式如下:
#include "apue.h"
#include
intquitflag;/* set nonzero by thread */
sigset_tmask;
pthread_mutex_t lock = pthread_mutex_initializer;
pthread_cond_t wait = pthread_cond_initializer;
void * thr_fn(void *arg)/*
專用的訊號處理執行緒*/
} }int main(void)
給執行緒傳送訊號
要把訊號傳送到程序,可以呼叫
kill
。要把訊號傳送到執行緒,可以呼叫
pthread_kill
。可以傳乙個0值的
signo
來檢查執行緒是否存在。如果訊號的預設處理動作是終止該程序,那麼把訊號傳遞給某個執行緒仍然會殺掉整個程序。
#include
int pthread_kill(pthread_t thread, int signo);
return: 0 if ok, error number on failure
APUE學習筆記 17 執行緒和訊號
by 潘雲登 date 2009 8 22 email intrepyd gmail.com homepage 對於商業目的下對本文的任何行為需經作者同意。寫在前面 1.本文內容對應 unix環境高階程式設計 第2版 第12章。2.總結了如何設定執行緒的訊號遮蔽字,以及如何使用專用線程進行訊號處理。...
APUE學習筆記 執行緒
採用多執行緒模式可以採用同步程式設計,而非非同步程式設計,可以簡化程式設計 多個程序間可以很方便的共享資料 可以通過pthread self獲得自身的執行緒id。執行緒id只在程序內部唯一。新建立執行緒不能保證那個執行緒先執行,新縣城可以訪問程序的位址空間,繼承執行緒的浮點環境和訊號遮蔽字。如果任意...
APUE學習筆記 10 訊號概念
by 潘雲登 對於商業目的下對本文的任何行為需經作者同意。寫在前面 1.本文內容對應 unix 環境高階程式設計 第 2版 第 10章。2.總結了有關訊號的基本概念,包括訊號產生的原因和對訊號的處理方式。3.訊號概念 訊號是軟體中斷,提供了一種處理非同步事件的方法。每個訊號都有乙個名字,以字元 si...