У меня есть простой сервер, который выглядит примерно так:
void *run_thread(void *arg) {
// Communicate via a blocking socket
}
int main() {
// Initialization happens here...
// Main event loop
while (1) {
new_client = accept(socket, ...);
pthread_create(&thread, NULL, &run_thread, *thread_data*);
pthread_detach(thread);
}
// Do cleanup stuff:
close(socket);
// Wait for existing threads to finish
exit(0);
)
Таким образом, при получении SIGINT или SIGTERM мне нужно выйти из цикла основного события, чтобы перейти к коду очистки. Более того, наиболее вероятно, что главный поток ожидает вызова accept (), поэтому он не может проверить какую-то другую переменную, чтобы определить, должна ли она прерваться;.
Большинство советов, которые я нашел, были примерно такими: http://devcry.blogspot.com/2009/05/pthreads-and-unix-signals.html (создание специального потока обработки сигналов, чтобы перехватывать все сигналы и обрабатывать их). Тем не менее, это часть обработки, которую я не могу по-настоящему обернуть: как я могу сказать основному потоку вернуться из вызова accept () и проверить внешнюю переменную, чтобы увидеть, должна ли она сломаться;