多线程对信号的接受处理
多线程 处理 信号 接受
2023-09-14 08:56:49 时间
最近刚从linux C转做android,老大突然看着我闲,叫我去验证一下“一个进程有多个子线程,子线程都注册监听某个信号,另一个进程向它发送该信号的时候,它会怎么处理?”。
带着这个问题,我搜索了各个贴子之后,大概得出:
进程处理信号,你需要注册signal的一个处理函数,线程你需要用signal_wait去等待一个信号。大体得出,如果一个多线程的进程得到了信号,它是会在它诸多子线程里面选一个来执行,有人说是正在进行的那个线程。在多线程环境下,一般会让其他子线程不处理信号,专门用一个线程来处理信号,把异步变成同步处理。
光看人家的贴子是不行的的。为此,我写了如下代码来验证:
#include stdio.h #include signal.h #include stddef.h #include unistd.h #include pthread.h #include string.h static pthread_t g_thread_ids[2]={0}; void ouch1(int sig) printf("mainthread interrupted,thread id:%u\n",(unsigned int)pthread_self()); //signal(SIGINT,SIG_DFL); void ouch2(int sig) printf("child thread 1 interrupted,thread id:%u\n",(unsigned int)pthread_self()); //signal(SIGINT,SIG_DFL); void ouch3(int sig) printf("child thread 2 interrupted,thread id:%u\n",(unsigned int)pthread_self()); //signal(SIGINT,SIG_DFL); void thread_loop1(char* msg) printf("child thread 1 signal now \n"); signal(SIGINT,ouch2); printf("chilid thread1:%d,%s",(int)getpid(),msg); while(1); void thread_loop2(char* msg) printf("child thread 2 signal now\n"); signal(SIGINT,ouch3); printf("child thread2:%d,%s",(int)getpid(),msg); while(1); void thread_wait2() //waiting for thread terminate if(g_thread_ids[0]!=0) pthread_join(g_thread_ids[0],NULL); printf("thread %d terminated\n",getpid()); if(g_thread_ids[1]!=0) pthread_join(g_thread_ids[1],NULL); printf("thread %d terminated\n",getpid());
printf("main thread signal now\n"); pthread_create( thread1,NULL,(void*)thread_loop1,(void*)msg1); g_thread_ids[0]=thread1; pthread_create( thread2,NULL,(void*)thread_loop2,(void*)msg2); g_thread_ids[1]=thread2; thread_wait2(); printf("all thread finished its tasks\n"); return ;
上述代码的输出是,谁最后调用signal,谁就会一直处理该信号。说明,跟正在执行的线程没关系,指定一个之后就会一直由它来处理。如果对一个信号注册了多次,那么最后一次有效,其他的都无效。
mark一下。
java线程间通讯的几种方式 并发编程中,我们可能会遇到这样一个场景 A、B两个线程并行,但是我希望保证B线程在A线程执行完了后再执行 这个时候就需要线程间进行通讯 A执行完了后对B说一声,喂,我执行完了
相关文章
- 多线程CAS机制(图解)
- c 线程安全的单例模式-c多线程并发处理方式_Java多线程面试题:线程锁+线程池+线程同步等
- 简述linux下的多线程编程
- Nodejs真.多线程处理详解编程语言
- java多线程之ReentrantLock的使用详解编程语言
- 关于synchronized和ReentrantLock之多线程同步详解编程语言
- Linux支持强大的多线程处理能力(linux支持多线程)
- 易语言搭建多线程MSSQL服务器(易语言mssql多线程)
- 攻克Redis 多线程最新技术挑战(最新redis多线程)
- 理解Redis多线程从概念到实现(怎么理解redis多线程)
- Redis中的多线程过期处理(redis过期 多线程)
- Redis过期处理开启多线程保护数据安全(redis过期 多线程)
- Redis过期处理更轻松,多线程实现更快速(redis过期 多线程)
- Redis过期多线程处理的挑战(redis过期 多线程)
- Redis过期多线程处理的新思路(redis过期 多线程)
- Redis缓存系统之多线程处理数据过期(redis过期 多线程)
- 一些.NET对多线程异常处理技巧分享
- java多线程中的异常处理机制简析
- Android多线程处理机制中的Handler使用介绍