线程与信号

原创 2012年08月29日 17:58:06

总结:

signal()设置对某种信号的处理方式,只能有一种处理方式,即设置进程、线程的信号handler,对进程、线程都有效。
pthread_kill()可以向线程发送信号。
pthread_sigmask()设置线程的阻塞信号集,但是仅仅对该线程有效。
kill()向进程发送信号,由哪个线程处理该信号是未知的。可能发生的情况是,进程本身屏蔽了该信号,而某个线程没有屏蔽改信号,进而该线程处理了该信号。

示例:

#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>

void sig_thread_func(int sig)
{
	printf("sig_thread_func : sig = %d\n", sig);
}
void sig_func(int sig)
{
	printf("sig_func : sig = %d\n",sig);
}

void *func1(void *arg)
{
    signal(SIGUSR1, sig_thread_func);   //线程1先运行,设置了signal

	sigset_t set;
	sigfillset(&set);
	sigdelset(&set, SIGUSR1);
	pthread_sigmask(SIG_SETMASK, &set, NULL);//线程1屏蔽了除了SIGUSR1外的所有信号

	printf("pthread 1 run\n");
	int i;
	for(i = 0; i < 7; ++i)
	{
		printf("1...\n");
		sleep(1);
	}
	return 0;
}
void *func2(void *arg)
{
	printf("pthread 2 run\n");
	int i;
	for(i = 0; i < 7; ++i)
	{
		printf("2...\n");
		sleep(1);
	}
	return 0;
}

int main()
{
	pthread_t tid1, tid2;
	pthread_create(&tid1, NULL, func1, NULL);
	pthread_create(&tid2, NULL, func2, NULL);

	sleep(1);
	signal(SIGUSR1, sig_func);  //覆盖了线程1设置的signal

    //向线程1发送SIGUSR1,SIGUSR2
	sleep(1);
	pthread_kill(tid1, SIGUSR1);//调动handler
	sleep(1);
	pthread_kill(tid1, SIGUSR2);//屏蔽了,无响应

    //向线程2发送SIGUSR1,SIGUSR2
	sleep(1);
	pthread_kill(tid2, SIGUSR1);//调用handler
	sleep(1);
	//pthread_kill(tid2, SIGUSR2);//会终止进程,是进程!

	sigset_t set;
	sigfillset(&set);
	sigprocmask(SIG_SETMASK, &set, NULL);//进程屏蔽了所有信号

	sleep(1);
	kill(getpid(), SIGUSR1);//调动handler?其实是线程1响应的

	pthread_join(tid1, NULL);
	pthread_join(tid2, NULL);

	return 0;
}
结果:

pthread 1 run
1...
pthread 2 run
2...
1...
2...
sig_func : sig = 10
1...
2...
1...
2...
sig_func : sig = 10
2...
1...
2...
1...
2...
sig_func : sig = 10
1...

一共对SIGUSR1响应了3次,分别是线程1、2、1响应的。





多线程编程(三)——线程同步——信号量

线程同步主要为了协调线程间工作,尤其是数据的使用, 第一个例子——生产者消费者: 设置: #库存最多1,有库存消费者才消费,没则等待;没库存生产者才生产,没则等待。 #并没有用semA本身做...
  • huqinweI987
  • huqinweI987
  • 2016年03月17日 16:34
  • 1006

线程与信号

类UNIX信号以前是专为进程设计的,它比线程的出现早了很多年。当线程模型出现后,专家们试图也在线程上实现信号,这导致了一个问题:如果要在线程模型中保持原来在进程中信号语意不变,是相当困难的。 避免信...
  • zhangfulin_hwatop
  • zhangfulin_hwatop
  • 2013年02月03日 21:44
  • 7731

多线程信号总结

linux 多线程信号总结(一) 1. 在多线程环境下,产生的信号是传递给整个进程的,一般而言,所有线程都有机会收到这个信号,进程在收到信号的的线程上下文执行信号处理函数,具体是哪个线程执行的难...
  • u012007928
  • u012007928
  • 2015年01月30日 15:56
  • 1042

pthread_kill-----向线程发送信号

别被名字吓到,pthread_kill可不是kill,而是向线程发送signal。还记得signal吗,大部分signal的默认动作是终止进程的运行,所以,我们才要用signal()去抓信号并加上处理...
  • dreamtdp
  • dreamtdp
  • 2012年05月07日 16:03
  • 2861

多线程中的信号机制--sigwait()函数

在Linux的多线程中使用信号机制,与在进程中使用信号机制有着根本的区别,可以说是完全不同。在进程环境中,对信号的处理是,先注册信号处理函数,当信号异步发生时,调用处理函数来处理信号。它完全是异步的(...
  • yusiguyuan
  • yusiguyuan
  • 2013年11月06日 18:41
  • 7925

QT多线程中,对象信号与槽连接不上的问题

连接不上的问题有很多种,如信号与槽的参数不匹配,参数为自定义类型等等。今天碰到的一个问题是多线程中,信号与槽一直连接不上。防止忘记,记录一下。          这个问题的情景是一个QObject的...
  • xytx_823
  • xytx_823
  • 2016年07月04日 11:06
  • 2169

Qt事件循环 跨线程信号和槽

先看段代码
  • sddsighhz
  • sddsighhz
  • 2014年07月04日 16:38
  • 1402

QT子线程与主线程的信号槽通信

最近用QT做一个服务器,众所周知,QT的主线程必须保持畅通,才能刷新UI。所以,网络通信端采用新开线程的方式。在涉及到使用子线程更新Ui上的控件时遇到了点儿麻烦。网上提供了很多同一线程不同类间采用信号...
  • jmy5945hh
  • jmy5945hh
  • 2014年06月26日 10:04
  • 24957

关于QT多线程子线程使用信号和槽

  • 2018年01月03日 13:35
  • 1KB
  • 下载

跨平台的C++线程模板类和信号量及互斥量模板类

  • 2016年09月07日 08:57
  • 9KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:线程与信号
举报原因:
原因补充:

(最多只允许输入30个字)