zoukankan      html  css  js  c++  java
  • pthread

    pkill 可以单独向某一个线程发信号:

    两个线程都注册了SIGUSR1信号,但只有线程tid1收到该信号

     1 #include "apue.h"
     2 #include <pthread.h>
     3 
     4 #define LOGI(format,...) printf("function: %s",format,__FUNCTION__, __VA_ARGS__)
     5 
     6 void sig_handle(int signo)
     7 {
     8     printf("%s:tid: (0x%lx) signo:%d
    ",__FUNCTION__, (unsigned long)pthread_self(),signo);
     9     pthread_exit((void*)3);
    10 }
    11 void *
    12 thr_fn1(void *arg)
    13 {
    14         signal(SIGUSR1,sig_handle);
    15         pid_t        pid;
    16     pthread_t    tid;
    17 
    18     pid = getpid();
    19     tid = pthread_self();
    20                 
    21     printf("thread 1 start
    ");
    22         printf("pid %lu tid %lu (0x%lx)
    ", (unsigned long)pid,
    23       (unsigned long)tid, (unsigned long)tid);
    24         while(1);
    25         printf("thread 1 end
    ");
    26     return((void *)1);
    27 }
    28 
    29 void sig_handle2(int signo)
    30 {
    31     printf("%s: tid: (0x%lx) signo:%d
    ", __FUNCTION__, (unsigned long)pthread_self(),signo);
    32     pthread_exit((void*)20);
    33 }
    34 
    35 void *
    36 thr_fn2(void *arg)
    37 {
    38         signal(SIGUSR1,sig_handle2);  
    39      pid_t        pid;
    40     pthread_t    tid;
    41 
    42     pid = getpid();
    43     tid = pthread_self();
    44     printf("thread 2 start
    ");
    45     printf("pid %lu tid %lu (0x%lx)
    ", (unsigned long)pid,
    46       (unsigned long)tid, (unsigned long)tid);
    47         sleep(12);
    48     printf("thread 2 end
    ");
    49     pthread_exit((void *)2);
    50 }
    51 
    52 int
    53 main(void)
    54 {
    55     int            err;
    56     pthread_t    tid1, tid2;
    57     void        *tret;
    58 
    59     err = pthread_create(&tid1, NULL, thr_fn1, NULL);
    60     if (err != 0)
    61         err_exit(err, "can't create thread 1");
    62     err = pthread_create(&tid2, NULL, thr_fn2, NULL);
    63     if (err != 0)
    64         err_exit(err, "can't create thread 2");
    65     
    66         sleep(2);
    67 
    68         pthread_kill(tid1,SIGUSR1);
    69 
    70         err = pthread_join(tid1, &tret);
    71     if (err != 0)
    72         err_exit(err, "can't join with thread 2");
    73     printf("thread 1 exit code %ld
    ", (long)tret);
    74  
    75         err = pthread_join(tid2, &tret);
    76     if (err != 0)
    77         err_exit(err, "can't join with thread 1");
    78     printf("thread 2 exit code %ld
    ", (long)tret);
    79     
    80     
    81     exit(0);
    82 }

    运行结果:

    w00367381@ubuntu:~/apue.3e/threads$ ./exitstatus 
    thread 2 start
    pid 3651 tid 140564637652736 (0x7fd7c14b9700)
    thread 1 start
    pid 3651 tid 140564646045440 (0x7fd7c1cba700)
    sig_handle:tid: (0x7fd7c1cba700) signo:10
    thread 1 exit code 3
    thread 2 end
    thread 2 exit code 2
  • 相关阅读:
    删除文件目录的两种方式
    求两个整数的最大公约数?
    MemCache在Windows环境下的搭建及启动
    hello cnblogs
    Extjs gridPanel可复制配置(转)
    命令模式、状态模式、责任链模式区别(转)
    UML类图几种关系的总结(转)
    观察者模式(转)
    Java之建造者模式(Builder Pattern)(转)
    Java设计模式之工厂方法模式(转) 实现是抽象工厂?
  • 原文地址:https://www.cnblogs.com/hixin/p/pthread.html
Copyright © 2011-2022 走看看