亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
最近訪問(wèn)板塊 發(fā)新帖
查看: 3103 | 回復(fù): 2
打印 上一主題 下一主題

懇求指教。∫粋(gè)線程異步信號(hào)的問(wèn)題 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2011-12-06 22:53 |只看該作者 |倒序?yàn)g覽
我想做一個(gè)程序的效果是線程在得到主控制的進(jìn)程發(fā)出的信號(hào)的時(shí)候才會(huì)運(yùn)行,但是在運(yùn)行的時(shí)候發(fā)現(xiàn)線程注冊(cè)的信號(hào)回調(diào)函數(shù)不能工作,我看書(shū)上說(shuō)的線程本質(zhì)也是輕量的進(jìn)程,而且本身也有信號(hào)處理機(jī)制。但是這個(gè)信號(hào)回調(diào)函數(shù)為何沒(méi)有反應(yīng)?
程序如下

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stdint.h>
  4. #include <string.h>
  5. #include <unistd.h>
  6. #include <signal.h>
  7. #include <errno.h>

  8. /**
  9. * 搭建一個(gè)線程,開(kāi)始阻塞,然后
  10. * 遇到一個(gè)信號(hào)后解除阻塞,開(kāi)始
  11. * 工作
  12. */
  13. //線程控制結(jié)構(gòu)體
  14. typedef struct pthread_control
  15. {
  16.         uint8_t flag:1;
  17.         uint8_t flag_b:1;
  18.         uint8_t flag_c:1;
  19.         uint8_t flag_d:1;
  20.         uint8_t flag_e:1;
  21.         uint8_t flag_f:1;
  22.         uint8_t flag_g:1;
  23.         uint8_t flag_h:1;
  24.         pthread_mutex_t num_mutex;
  25. } pth_ctrl;

  26. #define        PTHREAD_ON_SIG        SIGRTMIN+3
  27. #define        PTHREAD_OFF_SIG        SIGRTMAX-3

  28. void pth_on(int signo)
  29. {
  30.         puts("pthread now on\n");
  31. }

  32. //線程
  33. void *p_func(void *arg)
  34. {
  35.         uint32_t count = 0;
  36.         pth_ctrl *p_c = (pth_ctrl *)arg;
  37.         //安裝一個(gè)信號(hào)處理函數(shù)
  38.         signal(PTHREAD_ON_SIG,pth_on);//開(kāi)啟線程信號(hào)處理函數(shù)
  39.         //線程的異步信號(hào)只接收指定信號(hào)集給定的信號(hào)
  40.         sigset_t p_func_sig;
  41.         sigemptyset(&p_func_sig);//初始化一個(gè)空信號(hào)集
  42.         sigaddset(&p_func_sig,PTHREAD_ON_SIG);//填加一個(gè)信號(hào)集
  43.         int sig_arv;//到達(dá)的信號(hào)
  44.         uint8_t ctrl_flag;
  45.         while(1)
  46.         {
  47.                 pthread_mutex_lock(&(p_c->num_mutex));
  48.                 ctrl_flag = p_c->flag;
  49.                 pthread_mutex_unlock(&(p_c->num_mutex));
  50.                 if(ctrl_flag)
  51.                 {
  52.                         sigwait(&p_func_sig,&sig_arv);
  53.                         //p_c->flag = ~(p_c->flag);
  54.                         puts("thread on do what you want\n");
  55.                         ctrl_flag = !ctrl_flag;
  56.                 }
  57.                 pthread_mutex_lock(&(p_c->num_mutex));
  58.                 p_c->flag = ctrl_flag;
  59.                 pthread_mutex_unlock(&(p_c->num_mutex));
  60.                 printf("run %d times\n",count++);
  61.                 sleep(1);
  62.         }
  63. }


  64. int main(int argc,char *argv[])
  65. {
  66.         //初始化這個(gè)控制結(jié)構(gòu)體
  67.         pth_ctrl p_c;
  68.         memset(&p_c,0,sizeof(pth_ctrl));
  69.         p_c.flag = 1;
  70.         //線程初始化
  71.         pthread_t newthid;
  72.         if(pthread_create(&newthid,NULL,p_func,&p_c) != 0)
  73.         {
  74.                 perror("thread create failed");
  75.                 return -1;
  76.         }
  77.         //注冊(cè)一個(gè)信號(hào),采用定時(shí)器的方式
  78.         //在一定的時(shí)間向線程發(fā)送信號(hào)
  79.         //signal(PTHREAD_CTRL_TIMER,
  80.         while(1)
  81.         {
  82.                 //定時(shí)器發(fā)送信號(hào)
  83.                 sleep(5);
  84.                 pthread_kill(newthid,PTHREAD_ON_SIG);
  85.                 sleep(5);
  86.                 //這里應(yīng)該使用一個(gè)互斥體
  87.                 //將控制標(biāo)志鎖住,防止影
  88.                 //響其他線程
  89.                 pthread_mutex_lock(&(p_c.num_mutex));
  90.                 p_c.flag = 1;
  91.                 pthread_mutex_unlock(&(p_c.num_mutex));
  92.         }
  93.         return 0;
  94. }
復(fù)制代碼
這個(gè)程序運(yùn)行的效果

  1. thread on do what you want

  2. run 0 times
  3. run 1 times
  4. run 2 times
  5. run 3 times
  6. run 4 times
  7. thread on do what you want

  8. run 5 times
  9. run 6 times
  10. run 7 times
  11. run 8 times
  12. run 9 times
  13. ....
復(fù)制代碼
這個(gè)程序運(yùn)行的時(shí)候線程等待進(jìn)程發(fā)送信號(hào),然后解除阻塞運(yùn)行,然后運(yùn)行一段時(shí)間后,主線程修改和進(jìn)程共用的一個(gè)變量然后線程重新進(jìn)入阻塞狀態(tài)。但是就是沒(méi)有發(fā)現(xiàn)主進(jìn)程發(fā)送信號(hào)的時(shí)候,線程注冊(cè)的信號(hào)函數(shù)被調(diào)用(本來(lái)應(yīng)該打印一句話)。不知道是不是使用方法沒(méi)有對(duì)??懇求指教!謝謝!

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2011-12-19 16:40 |只看該作者
linux 多線程信號(hào)總結(jié)(一)
1. 在多線程環(huán)境下,產(chǎn)生的信號(hào)是傳遞給整個(gè)進(jìn)程的,一般而言,所有線程都有機(jī)會(huì)收到這個(gè)信號(hào),進(jìn)程在收到信號(hào)的的線程上下文執(zhí)行信號(hào)處理函數(shù),具體是哪個(gè)線程執(zhí)行的難以獲知。
2 signal函數(shù) BSD/Linux的實(shí)現(xiàn)并不在信號(hào)處理函數(shù)調(diào)用時(shí),恢復(fù)信號(hào)的處理為默認(rèn),而是在信號(hào)處理時(shí)阻塞此信號(hào),直到信號(hào)處理函數(shù)返回。其他實(shí)現(xiàn)可能在調(diào)用信號(hào)處理函數(shù)時(shí),恢復(fù)信號(hào)的處理為默認(rèn)方式,因而需要在信號(hào)處理函數(shù)中重建信號(hào)處理函數(shù)為我們定義的處理函數(shù),在這些系統(tǒng)中,較好的方法是使用sigaction來(lái)建立信號(hào)處理函數(shù)。
3 發(fā)送信號(hào)給進(jìn)程,哪個(gè)線程會(huì)收到? APUE說(shuō),在多線程的程序中,如果不做特殊的信號(hào)阻塞處理,當(dāng)發(fā)送信號(hào)給進(jìn)程時(shí),由系統(tǒng)選擇一個(gè)線程來(lái)處理這個(gè)信號(hào)。
4 如果進(jìn)程中,有的線程可以屏蔽了某個(gè)信號(hào),而某些線程可以處理這個(gè)信號(hào),則當(dāng)我們發(fā)送這個(gè)信號(hào)給進(jìn)程或者進(jìn)程中不能處理這個(gè)信號(hào)的線程時(shí),系統(tǒng)會(huì)將這個(gè)信號(hào)投遞到進(jìn)程號(hào)最小的那個(gè)可以處理這個(gè)信號(hào)的線程中去處理。
5 如果我們同時(shí)注冊(cè)了信號(hào)處理函數(shù),同時(shí)又用sigwait來(lái)等待這個(gè)信號(hào),誰(shuí)會(huì)取到信號(hào)?經(jīng)過(guò)實(shí)驗(yàn),Linux上sigwait的優(yōu)先級(jí)高。6 在Linux中的posix線程模型中,線程擁有獨(dú)立的進(jìn)程號(hào),可以通過(guò)getpid()得到線程的進(jìn)程號(hào),而線程號(hào)保存在pthread_t的值中。而主線程的進(jìn)程號(hào)就是整個(gè)進(jìn)程的進(jìn)程號(hào),因此向主進(jìn)程發(fā)送信號(hào)只會(huì)將信號(hào)發(fā)送到主線程中去。如果主線程設(shè)置了信號(hào)屏蔽,則信號(hào)會(huì)投遞到一個(gè)可以處理的線程中去。
7 當(dāng)調(diào)用SYSTEM函數(shù)去執(zhí)行SHELL命令時(shí),可以放心的阻塞SIGCHLD,因?yàn)镾YSTEM會(huì)自己處理子進(jìn)程終止的問(wèn)題。
8 使用sleep()時(shí),要以放心的去阻塞SIGALRM信號(hào),目前sleep函數(shù)都不會(huì)依賴于ALRM函數(shù)的SIGALRM信號(hào)來(lái)工作。

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2011-12-23 08:35 |只看該作者
sigwait的第二個(gè)參數(shù)是返回的信號(hào)值,你在后面進(jìn)行判斷,例如:

sigwait(&p_func_sig,&sig_arv);

if (PTHREAD_ON_SIG == sig_arv)
{
  puts("test: pthread now on\n");
}
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過(guò)ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP