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

当使用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引起的错误将终止整个程序.但我希望主线程继续运行,尽管这个错误.这有可能实现吗?

解决方法

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

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

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

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...