Linux多线程编程:对象同步之线程信号管理

来源:互联网 发布:淘宝美工待遇 编辑:程序博客网 时间:2024/06/05 15:35

      在线程中也可以使用Linux的信号机制,此处简要介绍Linux线程信号管理函数。

    1、pthread_kill 函数

   pthread_kill函数用来在线程发送信号。

 C++ Code 
1
extern int pthread_kill (pthread_t __threadid,int signo) __THROW;
    此函数有两个参数,threadid是要向其传送信号的线程。signo是要传送给线程的信号。thread_kill()函数用于请求将信号传送给线程。调用进程中,信号将被异步定向到线程。信号是在给定线程的环境中进行处理,如果信号操作导致线程终止或停止,此操作被会应用于整个进程。

   如果signo为0,就会进行错误检查而不发送信号。成功完成后,pthread_kill()将返回0。就会进行错误编号,用于指明错误。

    2、pthread_sigmask函数

    pthread_sigmask函数用来检查(或者更改)调用线程的信号掩码,pthread_sigmask()函数声明如下:

 C++ Code 
1
2
extern int pthread_sigmask (int __how, __const __sigset_t *__restrict __newmask,
                            __sigset_t *__restrict __oldmask) __THROW;
    第一个参数how定义如何更改调用线程的信号掩码。合法值包括:

   1、SIG_BLOCK。所得的集合是当前集合与参数oldmask 指向的信号集的并集。

   2、SIG_UNBLOCK。所得的集合是当前集合与参数oldmask指向的信号机的补集的交集。

   3、SIG_SETMASK。所得到的集合是参数oldmask指向的信号集。

第二个参数newmask指向信号集的指针,将用于更改当前阻塞的信号集。

第三个参数oldmask是指向前一个信号掩码将返回的位置指针。

   1、如果参数oldmask不是空指针,则前面的信号掩码将返回oldmask。

   2、如果newmask是空指针,则参数how的值无关紧要,线程的信号掩码不会更改,因此,可以通过调用来查询当前阻塞的信号。

   如果调用pthread_sigmask()后有未决的非阻塞信号,则在对pthread_sigmask()的调用返回之前,至少传送其中一个信号。

   需要注意的是,要阻塞SIGKILL或者SIGSTOP信号是不可能的。这是系统强制执行的,而不会导致指明错误。成功完成后,pthread_sigmask()返回0。否则,返回错误编号来指明错误。如果由于某种原因pthread_sigmask()失败,线程的信号掩码将不会变化。

   3、代码实例

   下面是一个使用线程信号的简单实例,在此程序中,主线程向子线程发送了一个KILL信号,以使子线程结束。

 C++ Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <iostream>

using namespace std;
#include<stdio.h>
#include<pthread.h>
#include<stdlib.h>
#include<unistd.h>
#include<signal.h>

void *test_program(void *arg);

int main(int argc, char *argv[])
{
    int i;
    pthread_t threadid;
    void *status;

    if(pthread_create(&threadid, NULL, test_program, NULL) > 0)
    {
        fprintf(stderr, "pthread_create failure\n");
        exit(EXIT_FAILURE);
    }
    sleep(5);
    printf("this is parent,send kill signal to thread %d\n", threadid);
    if(pthread_kill(threadid, SIGKILL) != 0)
    {
        perror("pthread_kill");
        exit(EXIT_FAILURE);
    }

    return 0;
}

void *test_program(void *arg)
{
    int i;
    for(i = 0;; i++)
    {
        sleep(1);
        printf("this is child thread ,%d\n", i);
        printf("wait for kill signal\n");
    }
    exit(EXIT_SUCCESS);
}




































0 0
原创粉丝点击