C ++ pthread - Как отменить поток? - PullRequest
2 голосов
/ 07 декабря 2011

У меня есть pthread, который я создал, и теперь я хочу, чтобы через определенный промежуток времени поток выполнял некоторый код. Но пользователь также должен иметь возможность отменить тему. Как я могу отменить поток и гарантировать, что поток не будет отменен при выполнении кода?

В Java вы справляетесь с

while(!isInterrupted)

Есть ли подобное решение с pthreads.

Ответы [ 4 ]

4 голосов
/ 07 декабря 2011

В примере кода Вопроса вы проверяете некоторую переменную. Это не нормальный шаблон прерывания потоков в Java.

В Java вы прерываете поток, вызывая метод interrupt().

Затем поток проверяет, не прерван ли он внутри ввода-вывода и системных вызовов (которые могут вызвать InterruptedException, когда это происходит; это означает, что поток, который находится в режиме ожидания или ожидания ввода-вывода, может быть вызван при прерывании), или путем выборки isInterrupted() флаг (обычно используется в условии в цикле, как в вопросе).

Различие важно; проверка некоторой объявленной вами переменной флага возможна только в циклах и в вашем собственном коде; система прерывания Java работает для всех потоков и всего кода, не блокирующего ЦП, без особых усилий со стороны программиста.

Pthreads имеет шаблон pthread_cancel(), который работает как шаблон прерывания Java.

3 голосов
/ 07 декабря 2011

pthread_cancel доступно для отправки запросов на отмену:

Тип отмены потока, определяемый pthread_setcanceltype(3), может быть асинхронным или отложенным (по умолчанию для новыхпотоки).Асинхронная отменяемость означает, что поток может быть отменен в любое время (обычно сразу, но система не гарантирует этого).Отложенная отменяемость означает, что отмена будет отложена до следующего вызова потока функцией, которая является точкой отмены.Список функций, которые являются или могут быть точками отмены, представлен в pthreads(7).

Состояние отмены потока, определяемое pthread_setcancelstate(3), может быть включено (по умолчанию для новых потоков) или отключено.Если поток отключил отмену, то запрос отмены остается в очереди, пока поток не разрешит отмену.Если поток разрешил отмену, то тип отмены определяет, когда происходит отмена.

2 голосов
/ 07 декабря 2011

Так что есть несколько вариантов:

1: во время проверки значения (работает очень хорошо, но у вас мало контроля).

2: проверьте страницу руководства pthread_cancel, она работает, но со строгими правилами.

3: используя pthread_signal, сначала нужно заблокировать, а затем подать сигнал для возобновления. Он имеет те же проблемы, что и второй вариант.

  • Использование pthreads отменяет, и сигнал будет работать только из потока, который должен быть заблокирован. Так что установка переменной для инициирования блока сигнала. Разблокировка может быть выполнена любым другим потоком.
  • То же самое можно сделать, используя мьютекс или семафор (pthread_mutex, pthread_semaphore).

Сайт, который я рекомендую: http://www.yolinux.com/TUTORIALS/LinuxTutorialPosixThreads.html

0 голосов
/ 07 декабря 2011

Нет специальной функции для отмены потока Вы можете использовать pthread_cancel для отмены потока, как уже упоминалось (но я бы советовал против этого, если вы не знаете, что делаете), и вынужно настроить свои таймеры.Но while(!isInterrupted) - вполне приемлемый способ сделать это.

В основном это должно быть так:

while(!isInterrupted)
{
// whatever you want to do
sleep(howLongYouWantToWait);
}
// clean up and exit the thread function here

и в главном потоке есть глобальный (или другой, см. Ниже)

volatile bool isInterrupted = false;

и установите его на true, когда вы закончите, и pthread_join, если вы хотите дождаться окончания потока.

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

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

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