Witam, mam program, który powinien zawiesić jeden wątek. Natomiast dzieje się tak, że zawiesza się cała aplikacja. Kod tego programiku:
#include <iostream>
#include <sstream>
#include <signal.h>
#include <cerrno>
#include <cstdio>
void suspend(int sig) {
sigset_t mask;
sigfillset(&mask);
sigdelset(&mask, SIGUSR2);
std::cout << "suspending" << std::endl;
while(1);
}
void* loopFunc(void*) {
int i = 0;
while(1) {
if(i % 10000 == 0) {
printf("Hello World%d\n", i);
}
i++;
}
}
void waitSomeTime() {
for(int i = 0; i < 10000000; i++) { }
}
int main(void) {
struct sigaction sa;
sa.sa_handler = suspend;
sa.sa_flags = SA_RESTART;
sigemptyset(&sa.sa_mask);
sigaction(SIGUSR1, &sa, NULL);
pthread_t thread1;
pthread_create(&thread1, 0, loopFunc, 0);
waitSomeTime();
pthread_kill(thread1, SIGUSR1);
std::cout << "Waiting for terminate..." << std::endl;
waitSomeTime();
return 0;
}
Handler sygnału wykonuje pętle while(1) tak więc nigdy nie wróci z obsługi sygnału. Więc wątek thread1 powinien zostać zawieszony. Natomiast dzieje się coś innego. Wiesza się cała aplikacja, nawet nie zostaje wypisana linijka: Waiting for terminate...
Gdy w wątku thread1 usune wypisywanie Hello Worlda to aplikacja nie zawiesza sie. Jak dam linuksowego write zamiast std::cout to aplikacja też się nie zawiesza... Czy ktoś może wytłumaczyć dlaczego tak się dzieje?
Czy u Was na linuksie też takie coś występuje? Już zaczynam się zastanawiać czy kernel przypadkiem nie nawala...