c # — можем ли мы использовать & quot; goto & quot; ключевое слово, чтобы закончить тему?

Во многих языках программирования было задано много вопросов, чтобы остановить выполнение threadc/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 ++, иначе мог бы реализовать и увидеть себя.

-1

Решение

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

1

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

Это не работает

  1. Ты не можешь goto в другой метод.
  2. Поток не связан с методом, и один метод может быть выполнен несколькими потоками.

Если goto Расположение будет в том же методе, выполнение будет просто продолжено в новом месте в потоке, который выполнил goto заявление.

Что ты Можно do, is перейти к концу метода потока — если текущий код находится в этом методе. Это не конец потока, но goto переместит поток программы непосредственно перед завершением метода потока, что приведет к тому, что метод потока завершит выполнение и тем самым завершит поток.
Это тот же эффект, что и просто returnметод из потока.

7

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

Ли ты должен это другой вопрос: за очень немногими исключениями, goto делает вашу программу менее читаемой; без исключения, вы можете достичь того же результата без gotoи улучшить читаемость одновременно. Например, вы можете использовать return завершить метод, реализующий логику вашего потока.

2

Вы не можете перейти к метке из функции вашего потока

Вы можете установить out: в конце нити функционирует. И таким образом, если вы хотите остановить свою тему, вы можете goto out: (из любого места в вашей функции потока) и функция потока будет остановлена

Если вы хотите выполнить некоторую часть вашего кода в конце вашего потока, вы можете использовать pthread_cond_signal(&cond);

следующая ссылка содержит пример того, как его использовать: порядок многопоточного запуска

1

Нет, ты не можешь.

Но, возможно, вам не нужно … Вы можете попробовать использовать ThreadAbortException (вызвав Thread.Abort ()) и перехватить его (да, в потоке), выполнив функцию ‘out’, и сделайте Thread.ResetAbort , Просто будьте осторожны и не забудьте прочитать о рисках, связанных с MSDN при вызове abort из другого потока (что вы, похоже, не делаете).

Смотрите также: http://msdn.microsoft.com/en-us/library/ty8d3wta.aspx

1

Прежде всего, добавление кода очистки в конец функции и переход к нему с помощью goto является вполне допустимым шаблоном в C. Используйте его, когда-либо делает код чище и проще для понимания. Конечно, им можно злоупотреблять, и он не работает так хорошо, когда у вас есть несколько уровней функций, поэтому он может поощрять создание слишком длинных функций просто для того, чтобы можно было перейти к очистке кода. Но пока он используется осторожно, goto Это также справедливо для C. Кроме того, поскольку вопрос немного расплывчатый, лучше сказать это прямо: вы не можете goto между функциями. И в языках, поддерживающих исключения, вы должны использовать их вместо goto (конечно, вы должны использовать их правильно, а не злоупотреблять ими).

Но часто, особенно с потоками, лучше зарегистрировать обработчики очистки для потока, так что вы можете просто затем возвращать или вызывать фреймворки потоков «выход из этого потока» вместо использования goto очистить код.

Наконец, с кодом выше, без кода после out: ярлык, вы могли бы просто return Вместо того, чтобы использовать goto… Предполагается, что вы используете библиотеку потоков, которая берет функцию для запуска в другом потоке и завершит поток, когда эта функция вернется.

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