亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 操作系統 > 正文

線程控制之線程和信號

2024-06-28 13:28:10
字體:
來源:轉載
供稿:網友
線程控制之線程和信號

每個線程都有自己的信號屏蔽字,但是信號的處理是進程中所有線程共享的。這意味著盡管單個線程可以阻止某些信號,但當線程修改了與某個信號相關的處理行為以后,所有的線程都必須共享這個處理行為的改變。

進程中的信號是遞送到單個線程的。如果信號與硬件故障或計時器超時相關,該信號就被發送到引起該事件的線程中去,而其他的信號則被發送到任意一個線程。

http://www.CUOXin.com/nufangrensheng/p/3515257.html中討論了進程如何使用sigPRocmask來阻止信號發送。sigpromask的行為在多線程的進程中并沒有定義,線程必須使用pthread_sigmask

#include <signal.h>int pthread_sigmask(int how, const sigset_t *restrict set, sigset_t *restrict oset);返回值:若成功則返回0,否則返回錯誤編號

pthread_sigmask函數與sigprocmask函數基本相同,除了pthread_sigmask工作在線程中,并且失敗時返回錯誤碼,而不像sigprocmask中那樣設置errno并返回-1。

線程可以通過調用sigwait等待一個或多個信號發生。

#include <signal.h>int sigwait(const sigset_t *restrict set, int *restrict signop);返回值:若成功則返回0,否則返回錯誤編號

set參數指出了線程等待的信號集,signop指向的整數將作為返回值,表明信號編號。

如果信號集中的某個信號在sigwait調用的時候處于未決狀態,那么sigwait將無阻塞地返回,在返回之前,sigwait將從進程中移除那些處于未決狀態的信號。為了避免錯誤動作發生,線程在調用sigwait之前,必須阻塞那些它正在等待的信號。sigwait函數會自動取消信號集的阻塞狀態,直到有新的信號被遞送。在返回之前,sigwait將恢復線程的信號屏蔽字。如果信號在sigwait調用的時候沒有被阻塞,在完成對sigwait調用之前會出現一個時間窗,在這個時間窗口期,某個信號可能在完成sigwait調用之前就被遞送了。

使用sigwait的好處在于它可以簡化信號處理,允許把異步產生的信號用同步的方式處理。為了防止信號中斷線程,可以把信號加到每個線程的信號屏蔽字中,然后安排專用線程作信號處理。這些專用線程可以進行函數調用,不需要擔心在信號處理程序中調用哪些函數是安全的,因為這些函數調用來自正常的線程環境,而非傳統的信號處理程序,傳統信號處理程序通常會中斷線程的正常執行。

如果多個線程在sigwait調用時,等待的是同一個信號,這時就會出現線程阻塞。當信號遞送的時候,只有一個線程可以從sigwait中返回。如果信號被捕獲(例如進程通過使用sigaction建立了一個信號處理函數),而且線程正在sigwait調用中等待同一個信號,那么這時將由操作系統實現來決定以何種方式遞送信號。在這種情況下,操作系統實現可以讓sigwait返回,也可以激活信號處理程序,但不可能出現兩者皆可的情況。

要把信號發送到進程,可以調用kill(見http://www.CUOXin.com/nufangrensheng/p/3514817.html);要把信號發送到線程,可以調用pthread_kill。

#include <signal.h>int pthread_kill(pthread_t thread, int signo);返回值:若成功則返回0,否則返回錯誤編號

可以傳一個0值的signo來檢查線程是否存在。如果信號的默認處理動作是終止該進程,那么把信號傳遞給某個線程仍然會殺掉整個進程。

注意鬧鐘定時器是進程資源,并且所有的線程共享相同的alarm。所以進程中的多個線程不可能互不干擾(或互不合作)地使用鬧鐘定時器。

實例

回憶程序清單10-16(http://www.CUOXin.com/nufangrensheng/p/3516427.html),等待信號處理程序設置標志,從而表明主程序應該退出。唯一可運行的控制線程就是主線程和信號處理程序,所以阻塞信號足以避免錯失標志修改。在線程中,需要使用互斥量來保護標志,如程序清單12-6所示。

程序清單12-6 同步信號處理

#include "apue.h"#include <pthread.h>int        quitflag;    /* set nonzero by thread */sigset_t    mask;pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;pthread_cond_t    wait = PTHREAD_COND_INITIALIZER;void *thr_fn(void *arg){    int err, signo;        for(; ;)    {        err = sigwait(&mask, &signo);        if(err != 0)            err_exit(err, "sigwait failed");        switch(signo)        {            case SIGINT:                printf("/ninterrupt/n");                break;                    case SIGQUIT:                pthread_mutex_lock(&lock);                quitflag = 1;                pthread_mutex_unlock(&lock);                pthread_cond_signal(&wait);                return(0);            default:                printf("unexpected signal %d/n", signo);                exit(1);                }    }}int main(void){    int        err;    sigset_t    oldmask;    pthread_t    tid;    sigemptyset(&mask);    sigaddset(&mask, SIGINT);    sigaddset(&mask, SIGQUIT);        if((err = pthread_sigmask(SIG_BLOCK, &mask, &oldmask)) != 0)        err_exit(err, "SIG_BLOCK error");        err = pthread_create(&tid, NULL, thr_fn, 0);    if(err != 0)        err_exit(err, "can't create thread");    pthread_mutex_lock(&lock);    while(quitflag == 0)        pthread_cond_wait(&wait, &lock);    pthread_mutex_unlock(&lock);    /* SIGQUIT has been caught and is now blocked; do whatever */    quitflag = 0;        /* reset signal mask which unblocks SIGQUIT */    if(sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0)        err_sys("SIG_SETMASK error");    exit(0);}

這里并不讓信號處理程序中斷主控線程,而是由專門的獨立控制線程進行信號處理。改動quitflag的值是在互斥量的保護下進行的,這樣主控線程不會在調用pthread_cond_signal時錯失喚醒調用。在主控線程中使用相同的互斥量來檢查標志的值,并且原子地釋放互斥量,等待條件的發生。

注意在主線程開始時阻塞SIGINT和SIGQUIT。當創建線程進行信號處理時,新建線程繼承了現有的信號屏蔽字。因為sigwait會解除信號的阻塞狀態,所以只有一個線程可以用于信號的接收。這使得對主線程進行編碼時不必擔心來自這些信號的中斷。

運行這個程序可以得到與程序10-16類似的輸出結果:

interrupt        鍵入中斷字符interrupt        再次鍵入中斷字符interrupt        再一次                    用結束字符終止

本篇博文內容摘自《UNIX環境高級編程》(第二版),僅作個人學習記錄所用。關于本書可參考:http://www.apuebook.com/。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美日韩性生活视频| 日韩av在线免播放器| 伊人久久大香线蕉av一区二区| 色yeye香蕉凹凸一区二区av| 久久五月情影视| 成人国内精品久久久久一区| 亚洲国产精品大全| 日韩欧美有码在线| 欧美日韩在线观看视频| 欧美高清在线播放| 久久露脸国产精品| 精品久久久久久电影| 国产精品成人aaaaa网站| 久久69精品久久久久久国产越南| 色播久久人人爽人人爽人人片视av| 亚洲欧美一区二区精品久久久| 精品国内自产拍在线观看| 成人国产精品久久久久久亚洲| 日本久久久a级免费| 隔壁老王国产在线精品| 国产99在线|中文| 欧美另类99xxxxx| 亚洲精品天天看| 国产成人+综合亚洲+天堂| 久久久国产精品x99av| 性欧美在线看片a免费观看| 日韩av高清不卡| 欧美日韩综合视频网址| 欧美高清自拍一区| 国产乱人伦真实精品视频| 国产成人拍精品视频午夜网站| 欧美裸体xxxxx| 成人黄色午夜影院| 国产一区二区三区毛片| 国模视频一区二区| 国产香蕉一区二区三区在线视频| 午夜精品久久久久久久男人的天堂| 久久精品精品电影网| 国产日韩欧美在线看| 日韩av影片在线观看| 5566日本婷婷色中文字幕97| 国模精品一区二区三区色天香| 青草青草久热精品视频在线观看| 精品国产一区二区三区久久久狼| 国产成人+综合亚洲+天堂| 91久久嫩草影院一区二区| 欧美日韩不卡合集视频| 色av中文字幕一区| 欧美丰满少妇xxxxx| 欧美成人合集magnet| 国产精品揄拍500视频| 欧美成人精品在线视频| 97视频在线观看免费高清完整版在线观看| 日韩电视剧在线观看免费网站| 欧美激情喷水视频| 日韩av在线免费播放| 国产精品爽爽爽| 亚洲人成网站777色婷婷| 欧美视频一二三| 综合136福利视频在线| 亚洲国产精品网站| 国产成人欧美在线观看| 欧美成人全部免费| 中文字幕欧美日韩va免费视频| 国产一区二区激情| 91精品啪在线观看麻豆免费| 亚洲欧美日韩一区在线| 国产精品对白刺激| 成人国产精品久久久久久亚洲| 欧美国产日韩一区| 亚洲开心激情网| 成人免费在线视频网址| 久久久久久久久久久久av| 精品国产户外野外| 亚洲毛片在线观看| 亚洲一区二区三区视频播放| 96精品视频在线| 国产区精品在线观看| 欧美日韩美女在线| www.日本久久久久com.| 久久香蕉频线观| 欧美人与性动交a欧美精品| 日韩美女写真福利在线观看| 亚洲人成77777在线观看网| 国产在线观看精品一区二区三区| 欧美激情小视频| 在线观看日韩视频| 精品久久久久久久久久久久久| 日韩中文第一页| 91精品在线一区| 色综合久久久久久中文网| 懂色av中文一区二区三区天美| 久久精品国产96久久久香蕉| 久久久久久国产精品美女| 亚洲少妇中文在线| 欧美精品videosex性欧美| 日韩av电影手机在线| 91亚洲精品在线| 日韩在线一区二区三区免费视频| 北条麻妃在线一区二区| 日韩精品在线看| 中文字幕日韩精品在线观看| 成人网页在线免费观看| 国内精品久久久久久| 午夜精品一区二区三区在线视频| 操日韩av在线电影| 欧美激情中文字幕在线| 国产精品久久久久av| 国产精品美女主播在线观看纯欲| 韩剧1988免费观看全集| 亚洲一区二区免费在线| 欧美成人剧情片在线观看| 久久久免费观看| 成人欧美一区二区三区在线湿哒哒| 国产成人91久久精品| 国产精品国语对白| 久久精品中文字幕免费mv| 欧美午夜宅男影院在线观看| 久久久影视精品| 亚洲国产高清福利视频| 免费99精品国产自在在线| 亚洲欧洲日产国产网站| 欧美在线视频导航| 久久精品91久久香蕉加勒比| 久久精品久久久久久国产 免费| 免费97视频在线精品国自产拍| 亚洲天堂视频在线观看| 亚洲国产天堂久久国产91| 日韩欧美在线观看视频| 亚洲一区二区福利| 国产精品综合不卡av| 成人妇女免费播放久久久| 亚洲乱码av中文一区二区| 久久精品一偷一偷国产| 隔壁老王国产在线精品| 中文字幕精品一区二区精品| 九九九热精品免费视频观看网站| 亚洲精品少妇网址| 精品国产视频在线| 51ⅴ精品国产91久久久久久| 久久露脸国产精品| 国产成人亚洲综合| 久久久电影免费观看完整版| 91精品国产91久久久久| 国产精品久久久久av| 97精品国产97久久久久久免费| 欧美一级淫片videoshd| 欧美整片在线观看| 色综合天天狠天天透天天伊人| 97涩涩爰在线观看亚洲| 亚洲国产精品久久精品怡红院| 欧美成人精品在线观看| 久久久电影免费观看完整版| 欧美激情精品久久久久久免费印度| 国产精品aaa| 国产亚洲美女精品久久久| 国产精品久久久久久久久久免费| 亚洲欧美精品在线| 一区二区三区视频免费| 国产日产久久高清欧美一区| 欧美日韩国产在线| 亚州成人av在线| 91美女福利视频高清| 精品久久久久久久久久久久久久|