2016-02-04 3 views
3

Предположим, у меня есть два потока ядра Linux, главный поток и рабочий поток. Мастер создает kthread_run() для создания рабочего. Пока рабочий принимает соединение сокетов и блокировку, мастер-вызовы kthread_stop(), чтобы остановить работника.Как остановить блокировку потока ядра Linux

Поскольку работник блокируется при принятии операции и не может выйти, kthread_stop() внутри мастера не вернется.

Что мне делать, чтобы убить рабочий поток из мастера грациозным способом? Благодарю.

+0

Является ли рабочий поток блокирующим ваш собственный код или блокирование где-то еще в ядре? –

+0

Рабочий поток блокируется в ядре, как чтение или работа в сети. – KyL

+1

Если это не в вашем коде, вероятно, вы вряд ли сможете это сделать. Я подозреваю, что рабочий поток разбужен вызовом 'kthread_stop()', проверяет, произошло ли условие, в котором оно ожидает, решает, что это еще не произошло, и возвращается в состояние ожидания. Чтобы изменить его поведение, вам нужно будет изменить проверочный код, чтобы проверить результат 'kthread_should_stop()' и предпринять соответствующие действия. –

ответ

0

Вы должны указать тайм-аут для блокировки сокета работник читает из:

struct timeval tv; 
tv.tv_sec = 0; /* 100 ms Timeout */ 
tv.tv_usec = 100000; 
kernel_setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(struct timeval)); 

Всякий раз, когда вызов RECV возвращает вам проверить kthread_should_stop(). При тайм-ауте 100 мс должны быть почти нулевые накладные расходы.