【发布时间】:2014-09-22 09:38:38
【问题描述】:
使用 posix 线程时,是否有某种方法可以“保护”主线程免受工作线程引起的错误(例如取消引用的空指针、被零除等)的影响。 “工作线程”是指由 pthread_create() 创建的 posix 线程。
不幸的是,我们不能使用异常——所以没有“catch”等。
这是我的测试程序(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 引起的错误会终止整个程序。但我希望主线程继续运行,尽管有这个错误。这有可能实现吗?
【问题讨论】:
-
'不幸的是,我们不能使用异常 - 所以没有“catch”等。' - 你当然可以。异常将在引发它的线程中抛出。
-
“保护”其他线程免受异常/错误影响的最佳方法是修复它们,使其不会发生或被检测和处理/记录/无论如何。
-
注意 - 在您上面的示例中,您正在尝试加入尚未创建的线程。
-
@MartinJames 啊,是的,你是对的,谢谢。尽管将这些行复制到我的示例中只是一个简单的错误(我的真实程序以正确的顺序运行)。我会编辑我的帖子。
-
@MartinJames “当然可以。异常将在引发它的线程中抛出”。我们的代码需要针对不支持异常的系统进行编译。
标签: c++ c pthreads signals posix