Как отменить pthread без точки отмены

Я использую стороннюю библиотеку (dcerpc) для моего приложения, являющегося сервером rpc.
Допустим, сторонняя функция находится в третьем пространстве имен.

Я вызываю третий :: слушать в потоке, чтобы прослушивать входящие запросы.

«Третий» предоставляет все механизмы для прерывания этого прослушивания и правильного выхода из потока, но либо он не работает, либо я делаю это неправильно.
Сначала я пробую все с помощью библиотечных инструментов (демонстрационный пример, список рассылки, просмотрите исходный код, чтобы понять …), но безуспешно.

Поэтому я пытаюсь найти альтернативу: насильственно убить поток прослушивания.
Но третий :: слушать не имеет точки отмены, я думаю.

Итак, этот код (я имитирую третий :: слушать с функцией прослушивания выше):

void* listen(void*)
{
cout << "listening for calls...." << endl;

while (true) {}
printf ("Server stoppped listening\n");
return 0;
}int main()
{

pthread_t thread = 0;

int res = pthread_create(&thread, 0, listen, 0);
cout << "pthread_create res: " << res << endl;

sleep(1);

bool isThreadRunning = (pthread_tryjoin_np(thread, 0) != 0);
cout << "Thread is running: " << isThreadRunning << endl;

res = pthread_cancel(thread);
cout << "pthread_cancel res: " << res << endl;

sleep(1);

isThreadRunning = (pthread_tryjoin_np(thread, 0) != 0);
cout << "Thread is running: " << isThreadRunning << endl;

res = pthread_join(thread, 0);
cout << "pthread_join res: " << res << endl;

return 0;
}

будет выводить:

pthread_create res: 0
listening for calls....

Thread is running: 1
pthread_cancel res: 0
Thread is running: 1

и блоки pthread_join (thread, 0) (логика, потому что нет точки отмены).

Мой вопрос: как убить эту ветку !!

Я пытался с сигналами, но это останавливает весь мой процесс, а не только поток.

Моя последняя попытка будет заключаться в том, чтобы изолировать прослушивание в отдельном процессе ветвления, но в контексте моего проекта, это действительно боль, чтобы разветвляться (это другая история).

Большое спасибо за любую помощь.

Николя.

0

Решение

Возможность отмены потока зависит от его отмены. государство а также тип. Состояние по умолчанию enabled, Так что все в порядке. Но тип по умолчанию deferred, Это означает, что когда вы отправляете потоку запрос на отмену, он откладывается до тех пор, пока не достигнет точки отмены. Поскольку ваш поток ничего не делает в пустом цикле, он вообще не достигает точки отмены. Следовательно, он не отвечает на pthread_cancel(),

Вы можете установить тип отмены потока в PTHREAD_CANCEL_ASYNCHRONOUS который обычно делает выход потока. Вызов

pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, 0);

перед петлей.

Или вы можете вызвать одну из функций, которая является точкой отмены. Например, сделать fflush(stdout); внутри петли.

POSIX перечисляет ряд функций в качестве точки отмены. Увидеть точки отмены за такой список.

Я не могу комментировать библиотеку «третьей стороны», которая не отвечает на текущие темы с ограниченной информацией, которую вы предоставили.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]