保护主线程免受工作线程中的错误的影响

 隐阁6090j 发布于 2022-12-20 12:19

当使用posix线程时,是否有某种方法可以"保护"主线程免受工作线程引起的错误(例如解除引用的空指针,除零等)."工作线程"是指由pthread_create()创建的posix线程.

不幸的是,我们不能使用例外 - 所以没有"捕获"等.

这是我的测试程序(C++):

void* workerThreadFunc(void* threadId) {
  int* a = NULL;
  *a = 5; //Error (segmentation fault)
  pthread_exit(NULL);
}

int main() {
  cout << "Main thread start" << endl;

  pthread_t workerThread;
  pthread_attr_t attr;
  pthread_attr_init(&attr);
  pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
  pthread_create(&workerThread, &attr, workerThreadFunc, (void*)0);
  pthread_join(workerThread, NULL);

  cout << "Main thread end" << endl;
}

在上面的示例中,workerThread引起的错误将终止整个程序.但我希望主线程继续运行,尽管这个错误.这有可能实现吗?

2 个回答
  • 听起来像你应该使用多个进程,而不是线程.独立进程会自动受到保护,免受其他进程中发生的这类错误的影响.

    您可以使用管道或共享内存(或其他形式的IPC)在线程之间传递数据,这样做的另一个好处就是只共享您要共享的内存,因此工作线程中的错误无法踩到堆栈上主"线程",因为它是一个单独的进程,具有单独的地址空间.

    线程可能很有用,但有几个缺点,有时在单独的进程中运行更合适.

    2022-12-20 12:21 回答
  • 我能想到这样做的唯一方法是注册一个信号处理程序,它可以代替中止程序,取消当前运行的线程,如下所示:

    void handler(int sig)
    {
        pthread_exit(NULL);
    }
    
    signal(SIGSEGV, handler);
    

    但请注意,这是不安全的,因为pthread_exit未在信号处理程序中列为安全系统调用之一.它可能会起作用,也可能不起作用,这取决于您正在运行的O/S,以及您正在处理的信号.

    2022-12-20 12:22 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有