Во многих языках программирования было задано много вопросов, чтобы остановить выполнение thread
.В c/c++
goto
все еще используется, где, как в Java
, goto не используется, но все еще зарезервировано; stop (), stop (Throwable) и suspend (), destroy () и resume (), которые предназначались для обеспечения основных функций запуска и остановки потока, устарели.
Можем ли мы использовать goto
просто выйти из потока?
Примерно так:
//Thread block
{...
if(some condition)
goto out;
.....
...
}//thread block over
out:
// I am out!!
}
Я знаю, используя goto
это очень и очень плохая практика, но все же ее можно использовать так?
ОБНОВИТЬ:
Или же:
//Thread block
{...
if(some condition)
goto out;
.....
...
out:
// I am out!!
}//thread block over
Из комментариев, это решение?
UPDATE2:
Ну, я получаю разные ответы. Иногда да, некоторые нет. Я не слишком много использую c / c ++, иначе мог бы реализовать и увидеть себя.
Вы не можете «выйти» из потока, используя goto. Выполнение потока не ограничено данной областью действия, и простое перемещение в другое место в вашем коде не приведет к его прекращению.
Это не работает
goto
в другой метод.Если goto
Расположение будет в том же методе, выполнение будет просто продолжено в новом месте в потоке, который выполнил goto
заявление.
Что ты Можно do, is перейти к концу метода потока — если текущий код находится в этом методе. Это не конец потока, но goto
переместит поток программы непосредственно перед завершением метода потока, что приведет к тому, что метод потока завершит выполнение и тем самым завершит поток.
Это тот же эффект, что и просто return
метод из потока.
Абсолютно ты Можно: ты можешь использовать goto
передать управление безоговорочно до конца вашего метода практически из любого места, с очень немногими ограничениями. Если это метод, который реализует ваш поток, он завершится, завершив поток.
Ли ты должен это другой вопрос: за очень немногими исключениями, goto
делает вашу программу менее читаемой; без исключения, вы можете достичь того же результата без goto
и улучшить читаемость одновременно. Например, вы можете использовать return
завершить метод, реализующий логику вашего потока.
Вы не можете перейти к метке из функции вашего потока
Вы можете установить out:
в конце нити функционирует. И таким образом, если вы хотите остановить свою тему, вы можете goto
out:
(из любого места в вашей функции потока) и функция потока будет остановлена
Если вы хотите выполнить некоторую часть вашего кода в конце вашего потока, вы можете использовать pthread_cond_signal(&cond);
следующая ссылка содержит пример того, как его использовать: порядок многопоточного запуска
Нет, ты не можешь.
Но, возможно, вам не нужно … Вы можете попробовать использовать ThreadAbortException (вызвав Thread.Abort ()) и перехватить его (да, в потоке), выполнив функцию ‘out’, и сделайте Thread.ResetAbort , Просто будьте осторожны и не забудьте прочитать о рисках, связанных с MSDN при вызове abort из другого потока (что вы, похоже, не делаете).
Смотрите также: http://msdn.microsoft.com/en-us/library/ty8d3wta.aspx
Прежде всего, добавление кода очистки в конец функции и переход к нему с помощью goto
является вполне допустимым шаблоном в C. Используйте его, когда-либо делает код чище и проще для понимания. Конечно, им можно злоупотреблять, и он не работает так хорошо, когда у вас есть несколько уровней функций, поэтому он может поощрять создание слишком длинных функций просто для того, чтобы можно было перейти к очистке кода. Но пока он используется осторожно, goto
Это также справедливо для C. Кроме того, поскольку вопрос немного расплывчатый, лучше сказать это прямо: вы не можете goto
между функциями. И в языках, поддерживающих исключения, вы должны использовать их вместо goto
(конечно, вы должны использовать их правильно, а не злоупотреблять ими).
Но часто, особенно с потоками, лучше зарегистрировать обработчики очистки для потока, так что вы можете просто затем возвращать или вызывать фреймворки потоков «выход из этого потока» вместо использования goto
очистить код.
Наконец, с кодом выше, без кода после out:
ярлык, вы могли бы просто return
Вместо того, чтобы использовать goto
… Предполагается, что вы используете библиотеку потоков, которая берет функцию для запуска в другом потоке и завершит поток, когда эта функция вернется.