MST

星途 面试题库

面试题:C语言多线程错误处理之信号处理与线程交互

在Linux环境下,C语言程序中有多个线程,其中一个线程需要处理特定信号(如SIGTERM)。当信号处理函数中检测到错误时,如何将这个错误信息有效地传达给其他线程,并且确保整个程序能够安全地退出?请详细描述实现思路,并给出较为完整的代码框架及关键注释。
17.1万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试

实现思路

  1. 使用全局变量:定义一个全局变量来存储错误信息,信号处理函数可以在检测到错误时设置该变量。
  2. 线程同步:使用互斥锁(pthread_mutex_t)来保护对全局变量的访问,确保多个线程访问该变量时不会发生竞态条件。
  3. 条件变量:使用条件变量(pthread_cond_t)通知其他线程有错误发生,避免其他线程一直轮询全局变量。
  4. 安全退出:在所有线程收到错误通知后,使用pthread_exitexit函数安全地退出程序。

代码框架

#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;
}

关键注释说明

  1. 全局变量error_message用于存储错误信息,error_occurred用于标志是否发生错误。
  2. 互斥锁和条件变量初始化pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;pthread_cond_t cond = PTHREAD_COND_INITIALIZER;初始化互斥锁和条件变量。
  3. 信号处理函数signal_handler函数在接收到SIGTERM信号时,设置错误信息并通过条件变量通知其他线程。
  4. 线程函数thread_function函数在循环中等待条件变量通知,收到通知后打印错误信息并安全退出。
  5. 主线程:主线程注册信号处理函数并创建线程,之后可以进行其他工作,最终等待线程结束并清理资源。