Я использую стороннюю библиотеку (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) (логика, потому что нет точки отмены).
Мой вопрос: как убить эту ветку !!
Я пытался с сигналами, но это останавливает весь мой процесс, а не только поток.
Моя последняя попытка будет заключаться в том, чтобы изолировать прослушивание в отдельном процессе ветвления, но в контексте моего проекта, это действительно боль, чтобы разветвляться (это другая история).
Большое спасибо за любую помощь.
Николя.
Возможность отмены потока зависит от его отмены. государство а также тип. Состояние по умолчанию enabled
, Так что все в порядке. Но тип по умолчанию deferred
, Это означает, что когда вы отправляете потоку запрос на отмену, он откладывается до тех пор, пока не достигнет точки отмены. Поскольку ваш поток ничего не делает в пустом цикле, он вообще не достигает точки отмены. Следовательно, он не отвечает на pthread_cancel()
,
Вы можете установить тип отмены потока в PTHREAD_CANCEL_ASYNCHRONOUS
который обычно делает выход потока. Вызов
pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, 0);
перед петлей.
Или вы можете вызвать одну из функций, которая является точкой отмены. Например, сделать fflush(stdout);
внутри петли.
POSIX перечисляет ряд функций в качестве точки отмены. Увидеть точки отмены за такой список.
Я не могу комментировать библиотеку «третьей стороны», которая не отвечает на текущие темы с ограниченной информацией, которую вы предоставили.
Других решений пока нет …