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

      在线程中也可以使用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);
}




































评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值