Boost, C ++, как убить поток, открытый другим потоком? - PullRequest
1 голос
/ 08 ноября 2010

так что у меня есть некоторые основные функции. 24 раза в секунду он открывает поток повышения A с функцией. эта функция принимает в буфер с данными. Это запускает таймер повышения. Он открывает другой поток B с функцией отправки буфера в него. Мне нужен поток A, чтобы убить поток B, если он выполняет путь 2 долго. Конечно, если поток B был выполнен вовремя, мне не нужно его убивать, он должен сам себя убить. Какая функция повышения может помочь мне убить созданный поток (не объединить - остановить / убить или что-то в этом роде)?

Кстати, я не могу повлиять на скорость функции, которую я выполняю в потоке B, поэтому я должен быть способен убить ее при необходимости.

Ответы [ 3 ]

5 голосов
/ 08 ноября 2010

Нет чистого способа уничтожить поток, поэтому, если вам нужно сделать что-то подобное, вы должны либо использовать функцию, которая включает в себя некоторую возможность отмены, либо использовать для нее отдельный процесс, поскольку вы может убить процесс чисто.

Кроме этого, моя немедленная реакция заключается в том, что вместо «открытия» (вы имеете в виду создание?) потока А 24 раза в секунду, вам будет лучше снить A читает буфер, отправляет его в нить B, затем спит, пока не будет готова прочитать другой буфер.Создание и уничтожение потоков не ужасно дорого, но делать это со скоростью 24 (или, по-видимому, 48) в секунду мне кажется немного чрезмерным.

4 голосов
/ 08 ноября 2010

Вы ищете термин «отмена», как в pthread_cancel (3) . Отмена проблематична, потому что отмененный поток может не выполнять деструкторы C ++ или снимать блокировки при выходе ... но с другой стороны, это может произойти; неопределенность на самом деле хуже , чем окончательное нет.

Из-за этого потоки наддува не поддерживают отмену (см., Например, этот старый вопрос ), но они поддерживают прерывание , которое вы могли бы согнуть, чтобы подогнать. Прерывание работает посредством обычного исключения C ++, поэтому оно имеет предсказуемую семантику.

2 голосов
/ 08 ноября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...