多线程下的signal信号处理

多线程中,信号在哪个线程中处理是不确定的,可能被任意一个线程处理

下边的代码可以验证该结论,多次Ctrl+c,会被不同的线程捕获此信号,并处理,最终每个线程死锁,阻塞在等待锁的状态

cpp 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <pthread.h>
#include <unistd.h>
pthread_mutex_t lock;
// 信号处理函数
void sigint_handler(int signum) {
    printf("Received SIGINT signal, %ld\n",pthread_self());
	printf("lock line %d\n",__LINE__);
	pthread_mutex_lock(&lock);
	//usleep(100);
	pthread_mutex_unlock(&lock);
	printf("unlock line %d\n",__LINE__);
}

// 线程函数
void* thread_func(void* arg) {
    while (1) { 
		printf("thread process, %ld\n",pthread_self());
		usleep(100000);
    }
    return NULL;
}

int main() {
    signal(SIGINT, sigint_handler);  // 注册SIGINT信号的处理函数
	printf("main process, %ld\n",pthread_self());
    pthread_t thread1, thread2;
    pthread_create(&thread1, NULL, thread_func, NULL);  // 创建一个新线程
	pthread_create(&thread2, NULL, thread_func, NULL);  // 创建一个新线程
	while(1)
	{
		printf("lock line %d\n",__LINE__);		
		pthread_mutex_lock(&lock);
        usleep(100000);
		pthread_mutex_unlock(&lock);
		printf("unlock line %d\n",__LINE__);
	
	}
    pthread_join(thread1, NULL);  // 等待新线程退出
	pthread_join(thread2, NULL);  // 等待新线程退出
    return 0;
}

Linux多线程信号处理浅谈_linux信号处理函数在哪个线程_hdxbw-wq的博客-CSDN博客

相关推荐
禁小默2 小时前
第四届图像、信号处理与模式识别国际学术会议(ISPP 2025)
信号处理
敢嗣先锋2 小时前
鸿蒙5.0实战案例:基于ArkUI启动冷启动过程最大连续丢帧数问题分析思路&案例
性能优化·移动开发·多线程·harmonyos·arkui·鸿蒙开发
yue0085 小时前
C#项目05-猜数字多线程
c#·多线程·猜数字·invoke·control·项目案例·methodinvoke
敢嗣先锋2 天前
鸿蒙5.0实战案例:基于List和Scroller由简单到复杂列表布局开发实践
list·移动开发·多线程·harmonyos·arkui·组件化·鸿蒙开发
IT规划师2 天前
并发编程 - 线程同步(九)之信号量Semaphore
多线程·并发编程·线程同步
多喝烧碱2 天前
第四届图像、信号处理与模式识别国际学术会议(ISPP 2025)
信号处理
鲤籽鲲2 天前
C# ConcurrentBag 使用详解
windows·microsoft·c#·多线程
linux开发之路3 天前
C++Linux进阶项目分析-仿写Redis之Qedis
linux·c++·redis·多线程·后端开发
VB.Net4 天前
15.1 Process(进程)类
c#·多线程
IT规划师4 天前
并发编程 - 线程同步(八)之自旋锁SpinLock
多线程·并发编程·线程同步