Как убить поток, созданный с помощью CLONE_THREAD и заблокированный на общем ресурсе в пространстве ядра? - PullRequest
0 голосов
/ 05 марта 2011

У меня есть тестовый случай, когда есть потоки, созданные с помощью опции CLONE_THREAD в clone (). Вот если я хочу убить определенный поток, я полагаю, что мы должны использовать SYS_tgkill в systemcall (). Но повлияет ли уничтожение на поток, если он ожидает в пространстве ядра (скажем, futex_wait)?

Я попытался убить поток, созданный описанным выше способом. Но когда SIGKILL отправляется тому же самому процессу, весь процесс убивается. Я что-то упустил при использовании syscall (SYS_tgkill, pid, tid, 9)?

1 Ответ

1 голос
/ 12 сентября 2011

SIGKILL всегда убивает цель процесс . Обойти это невозможно; он не блокируемый, неуважительный и неуловимый.

Вы можете попробовать отправить другой сигнал (например, SIGUSR1 или SIGHUP или SIGRTMIN) и установить обработчик сигнала, который вызывает pthread_exit (но учтите, что эта функция не безопасна для асинхронного сигнала, поэтому вы должен убедиться, что обработчик сигнала не прерывал другую небезопасную асинхронную функцию) или использовать отмену (pthread_cancel), чтобы остановить заблокированный поток.

Это должно работать для обычных операций блокировки (например, ожидания данных из канала или сокета), но это не поможет вам, если поток находится в непрерывном спящем состоянии (например, попытка чтения с сильно поцарапанного компакт-диска или сбой жесткого диска). диск).

...