多线程编程指南

定向于线程的信号

借助定向于线程的信号的概念,对 UNIX 信号机制得到了扩展。定向于线程的信号就像普通的异步信号一样,但定向于线程的信号是被发送到特定线程,而不是进程。

与安装用于处理信号的信号处理程序相比,使用等待异步信号的单独线程可能更安全且更简单。

一种处理异步信号的更好方式是同步处理这些信号。通过调用 sigwait(2),线程可以一直等待,直到信号出现为止。请参见等待指定信号


示例 5–2 异步信号和 sigwait(2)

main() {

    sigset_t set;

    void runA(void);

    int sig;



    sigemptyset(&set);

    sigaddset(&set, SIGINT);

    pthread_sigmask(SIG_BLOCK, &set, NULL);

    pthread_create(NULL, 0, runA, NULL, PTHREAD_DETACHED, NULL);



    while (1) {

        sigwait(&set, &sig);

        printf("nestcount = %d\n", nestcount);

        printf("received signal %d\n", sig);

    }

}



void runA() {

    A(4,4);

    exit(0);

}

本示例将修改示例 5–1 的代码。主例程将屏蔽 SIGINT 信号,创建一个子线程(用于调用前一个示例的函数 A),并发出 sigwait() 来处理 SIGINT 信号。

请注意,信号在计算线程中将被屏蔽,因为计算线程将从主线程继承其信号掩码。当且仅当主线程在 sigwait() 内部不受阻塞时,才能受到保护,而不去处理 SIGINT

另外,请注意,使用 sigwait() 时不存在中断系统调用的危险。