实现思路
- 使用全局变量:定义一个全局变量来存储错误信息,信号处理函数可以在检测到错误时设置该变量。
- 线程同步:使用互斥锁(
pthread_mutex_t
)来保护对全局变量的访问,确保多个线程访问该变量时不会发生竞态条件。
- 条件变量:使用条件变量(
pthread_cond_t
)通知其他线程有错误发生,避免其他线程一直轮询全局变量。
- 安全退出:在所有线程收到错误通知后,使用
pthread_exit
或exit
函数安全地退出程序。
代码框架
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <signal.h>
#include <string.h>
// 全局变量存储错误信息
char error_message[256];
// 互斥锁保护对全局变量的访问
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
// 条件变量通知其他线程
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
// 标志位表示是否发生错误
int error_occurred = 0;
// 信号处理函数
void signal_handler(int signum) {
if (signum == SIGTERM) {
// 加锁保护全局变量
pthread_mutex_lock(&mutex);
strcpy(error_message, "SIGTERM received, something went wrong.");
error_occurred = 1;
// 解锁
pthread_mutex_unlock(&mutex);
// 通知其他线程
pthread_cond_broadcast(&cond);
}
}
// 线程函数示例
void* thread_function(void* arg) {
// 加锁
pthread_mutex_lock(&mutex);
while (!error_occurred) {
// 等待条件变量通知
pthread_cond_wait(&cond, &mutex);
}
printf("Thread received error: %s\n", error_message);
// 解锁
pthread_mutex_unlock(&mutex);
// 线程安全退出
pthread_exit(NULL);
}
int main() {
pthread_t thread;
// 注册信号处理函数
signal(SIGTERM, signal_handler);
// 创建线程
if (pthread_create(&thread, NULL, thread_function, NULL) != 0) {
perror("pthread_create");
return 1;
}
// 主线程可以做其他工作
while (1) {
// 模拟工作
sleep(1);
}
// 等待线程结束(实际上不会执行到这里,因为会被SIGTERM中断)
pthread_join(thread, NULL);
// 清理互斥锁和条件变量
pthread_mutex_destroy(&mutex);
pthread_cond_destroy(&cond);
return 0;
}
关键注释说明
- 全局变量:
error_message
用于存储错误信息,error_occurred
用于标志是否发生错误。
- 互斥锁和条件变量初始化:
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
和pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
初始化互斥锁和条件变量。
- 信号处理函数:
signal_handler
函数在接收到SIGTERM
信号时,设置错误信息并通过条件变量通知其他线程。
- 线程函数:
thread_function
函数在循环中等待条件变量通知,收到通知后打印错误信息并安全退出。
- 主线程:主线程注册信号处理函数并创建线程,之后可以进行其他工作,最终等待线程结束并清理资源。