请教:多线程模式下的信号处理问题

think__ 2004-10-26 04:37:19
根据《实用UNIX编程》一书第十章——线程同步的介绍。在多线程模式下,对于一个发送到进程的信号,将在所有对该信号非阻塞的线程中调度一个来处理该信号,并提供了相应例程。我对应该例程做了一个简化版的程序,测试时却发现未能如预期。

在主线程中阻塞了SIGUSR1信号。然后创建两个线程thread1,thread2,该两线程应继承主线程的线程屏蔽,即对SIGUSR1信号是阻塞的。在thread1中,取消了对SIGUSR1信号的阻塞,按预期,thread1应是唯一对SIGUSR1信号非阻塞的线程,该信号将由thread1来处理。

但实际上,我利用kill -USR1 pid 向进程发送信号时,却无任何响应,所有线程都没有捕捉到该信号!如果在主线程中未阻塞信号,则发送到进程的信号都由主线程捕捉处理。

系统:red linux 9.0

请教高手!
...全文
236 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
winux0 2004-10-27
  • 打赏
  • 举报
回复
pthread库也在不断更新,会尽量朝着posix的方向发展
不必为了一些细节考虑那么多,知道是这么回事就可以了
比这更郁闷的情况我也碰上过
cvsuser 2004-10-27
  • 打赏
  • 举报
回复
posix只是定义了一套函数接口标准,并没有什么规定实现细节,比如有些平台是用户级线程有些像linux就是轻量级进程,也叫混合线程,内核要支持轻量级线程必须首先支持内核级线程。

另外这些对不同的信号响应方式是不一样的,比如SIGALRM信号是由调用alarm()的线程响应,
think__ 2004-10-27
  • 打赏
  • 举报
回复
恩,查了一些资料,大约是LinuxThread对POSIX1.b标准支持不是很好。因为linux中的线程不是真正的线程,在内核中是轻量级的进程。因此到进程的信号,不能在所有线程间调度处理(因为它们相当于独立的进程),所以出现上述现象。

请方家确证!
think__ 2004-10-26
  • 打赏
  • 举报
回复
代码:

#include <iostream>
using namespace std;
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
#include <pthread.h>
#include <unistd.h>
#include <sys/timeb.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <string.h>

typedef void* (*th_start) (void*);
void SignalProc(int sig);

void th1(void* arg)
{
//Unblock SIGUSR1
sigset_t set;
sigemptyset(&set);
sigaddset(&set, SIGUSR1);
pthread_sigmask(SIG_UNBLOCK, &set, NULL);

cout<<"thread1 start:"<<pthread_self()<<endl;
pause();
cout<<"thread1 end"<<endl;
return;
}

void th2(void* arg)
{
cout<<"thread2 start:"<<pthread_self()<<endl;
pause();
cout<<"thread2 end"<<endl;
return;
}

int main()
{
cout<<"main proc; proc id: "<<getpid()<<" main thread id:"<<pthread_self()<<endl;

//install SIGUSR1 proc
struct sigaction sysact ;
sysact.sa_handler = SignalProc ;
sigemptyset(&sysact.sa_mask);
sysact.sa_flags = 0 ;

if (sigaction(SIGUSR1, &sysact, NULL) == -1)
{
cout<<"Can't install SIGUSR1 signal handler"<<endl;
return 0;
}

//block SIGUSR1
sigset_t set;
sigemptyset(&set);
sigaddset(&set, SIGUSR1);
sigprocmask(SIG_BLOCK, &set, NULL);

//create threads
pthread_t t1;
pthread_t t2;

pthread_create(&t1, NULL, (th_start)&th1, NULL);
cout<<"thread1 created. proc id: "<<getpid()<<" thread id:"<<t1<<endl;
pthread_create(&t2, NULL, (th_start)&th2, NULL);
cout<<"thread2 created. proc id: "<<getpid()<<" thread id:"<<t2<<endl;

pause();
cout<<"quit!!!!"<<endl;
return 0;
}

void SignalProc(int sig)
{
cout<<"sig proc; sig id:"<<sig<<" thread id:"<<pthread_self()<<endl;
}

23,120

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧