Podczas korzystania z wątków POSIX, istnieje sposób "ochrony" głównego wątku przed błędami (takimi jak dereferencje wskaźników zerowych, dzielenie przez zero itd.) Spowodowanych przez wątki robocze. Przez "wątek roboczy" mam na myśli wątek posix stworzony przez pthread_create().Ochrona głównego wątku przed błędami w wątku roboczym
Niestety, nie możemy używać wyjątków - tak nie "złapać", itp
Tu jest mój program testowy (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;
}
W powyższym przykładzie, błąd spowodowany przez workerThread będzie zakończyć cały program. Ale chciałbym, aby główny wątek nadal działał pomimo tego błędu. Czy można to osiągnąć?
"Niestety, nie możemy używać wyjątków - więc nie ma" złapania "itp." - oczywiście że możesz. Wyjątek zostanie zgłoszony w wątku, który go podniósł. –
Najlepszy sposób, aby "chronić" inne wątki przed wyjątkami/błędy, aby je naprawić, aby się nie pojawiły, nie zostały wykryte i nie były obsługiwane/rejestrowane/cokolwiek. –
Uwaga - w powyższym przykładzie próbujesz dołączyć do wątku, który nie został jeszcze utworzony. –