Форум программистов, компьютерный форум CyberForum.ru

Многопоточность, выход из бесконечного цикла c++11 - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.67
el_gato_de_Ch
35 / 35 / 1
Регистрация: 28.04.2013
Сообщений: 110
03.06.2014, 23:06     Многопоточность, выход из бесконечного цикла c++11 #1
Всем привет. Я в задачах многопоточности - новичок (начал ей заниматься буквально несколько часов назад), инфу искал, читал, но как-то пока не помогает.

Столкнулся с задачей (с++11 std::thread) код не оригинальный, а упрощённый, чтобы показать саму суть, подразумевается, что все необходимые include'ы уже есть.

есть
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class SomeClass
{
private:
   bool _stopCycle;
public:
  void inifiniteWhile()
  {
      _stopCycle = false;
 
      while(!_stopCycle)
      {
          // do things ...
          // show window
      }
  }
 
   void stop() {_stopCycle = false;}
 
};
Main function

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int main()
{
   SomeClass obj;
   thread someThread(&SomeClass::obj, infiniteCycle);
 
   while(/*read command from cmd*/)
   {
      if(cmd == exit)
      {
         obj.stop();
         break;
      }
   }
 
   system("pause");
}
Гарантируется, что из while(read cmd) программа выходит, т.е. я прихожу к system("pause");

Проблема: someThread не останавливает работу функции infinite. Цикл так и продолжает крутиться, выполняются do things и show window.
Вопрос: Как завершить цикл ?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.06.2014, 23:06     Многопоточность, выход из бесконечного цикла c++11
Посмотрите здесь:

C++ Выход из бесконечного цикла по нажатию кнопки.
Выход из цикла C++
не работает проверка бесконечного цикла C++
Выход из цикла C++
Выход из цикла C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Psilon
Master of Orion
 Аватар для Psilon
5738 / 4686 / 619
Регистрация: 10.07.2011
Сообщений: 14,160
Записей в блоге: 5
Завершенные тесты: 4
06.06.2014, 08:04     Многопоточность, выход из бесконечного цикла c++11 #61
Цитата Сообщение от taras atavin Посмотреть сообщение
Только в симуляторе чего то столь же тупого, как автомобиль, можно не сообщать пользователю, что он делает что то не то, но и тогда кнопка то пусть нажмётся, а функция вызываться не должна, если только логика не вынесена прямо в обработчик, тогда если там простое присваивание, пусть выполнится в холостую, а если какая то последовательность действий по некому алгоритму, то пусть ограничится проверкой флага и завершится. А если стоп до старта - это не что то не то, значит это приказ не запускать вторичный поток и его тоже надо выполнить.
вы принцип MVC понимаете? Так вот, ограничения "нажатий" и прочего - это проблемы вьюшки-гуя, а не модели, которая в данном случае представлена классом. С точки зрения модели это валидное действие.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
06.06.2014, 08:22     Многопоточность, выход из бесконечного цикла c++11 #62
Если это валидное действие, то оно имеет смысл, в неделании ничего смысла нет. Так что наоборот гуй ещё может пропустить достартовое кнопкотыкство, или опрос клавы не ответить на пользователю, да и то в симуляторе, а методы должны вызываться обдумано и не вызываться в том случае, когда не нужны. Именно с точки зрения модели плавное торможение турбины на незаведённом двигателе - ошибка, а вовсе не нажатие кнопки "стоп" на уровне интерфейса всего симулятора.
Psilon
Master of Orion
 Аватар для Psilon
5738 / 4686 / 619
Регистрация: 10.07.2011
Сообщений: 14,160
Записей в блоге: 5
Завершенные тесты: 4
06.06.2014, 21:35     Многопоточность, выход из бесконечного цикла c++11 #63
taras atavin, лично я вижу всего 2 варианта:
первый, тупо ничего не делать, этакое проглатывание ошибки. В целом не очень хорошо, но по бизнес-логике может быть единственным правильным действием в таком состоянии (конечный автомат нарисован именно с таким переходом).
второй, более разумный вариант - бросить исключение о попытке остановить стоящую машину.

Любой другой вариант мне кажется по крайней мере странным Например, после команды остановки ждать, пока кто-нибудь запустит чтобы сразу же остановить. Или еще какая-нибудь экзотика.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
07.06.2014, 09:37     Многопоточность, выход из бесконечного цикла c++11 #64
Нет.
1. Стоп может быть предназначен для остановки только действующего потока, тогда надо исключить сам вызов, обработчик же события в интерфейсе пользователя должен отработать ошибку и самостоятельно обойти вызов останавливающей функции в API. При этом он может как проглотить ошибку, если симулирует достаточно тупое устройство, или выдать сообщение об ошибке через пользовательский интерфейс. Но не исключение, оно должно бросаться, только если вызывающая программа уже передала что нибудь некорректное, при нехватке ресурсов и при ошибке в девайсе, например, сказано достичь некоторой скорости, а в процессе разгона вдруг оказалось, что в баке нет бензина. В остальных случаях нет нужды передавать сигнал об ошибке через несколько уровней, она регистрируестя в интерфейсе пользователя и там же генерится сообщение. По-старому.
2. Или же стоп может иметь два назначения:
2.1. Остановка действующего потока.
2.2. Предотвращение старта потока.
Это соответствует случаю тормоза в автомобиле, который может быть заведён и на склоне горки, при этом со стояночного тормоза он должен быть уже снят, а назад не покатиться. Тогда тормоз и нажимают для предотвращения начала движения. Но в автомобиле тормоз отменяется отпусканием той же педали. Это связано с тем, что автомобиль - штука предельно тупая, это самобеглый заменитель кареты и чего более, сколь бы современными двигателями и электронным управлением он ни оснащался. Поэтому команда длительного действия должна продолжать подаваться. Если ты отпустил тормоз, то заведя двигатель и отпустив сцепление заставишь машину двигаться, если держишь, ехать она не должна. На компьютере бывают залипающие экранные кнопки и раздельные горячие клавиши для команды и её отмены, а в текстовом интерфейсе команда, способная что то предотвратить, отменяется только другой явной командой. При этом автомобиль слишком туп, чтоб сказать, что нажатие тормоза для предотвращения движения оказалось излишним, или чтоб исключить применение педали тормоза для предотвращения качения с горки. Компьютер же, если он не симулирует что то столь же тупое, как автомобиль, может ограничить команду единственным назначением и в некоторых случаях предотвратить саму подачу команды, а когда это не возможно, сообщить пользователю об ошибочности его действий и обойти дальнейшую передачу команды внутри программы, то есть главный цикл отработает строку "stop" и состояние, выдаст сообщение, а функцию stop() не вызовет. Но когда такое поведение не требуется, комп может вести себя подобно автомобилю, с той обязательной разницей, что отмена команды API не заключается в прекращении её подачи, а требует отдельного вызова. При эмуляции же чего то столь же тупого, как автомобиль, комп должен вести себя подобно симулируемому объекту с тем нюансом, что отмена команды API требует отдельного вызова. Отпусканию педали тормоза соответствует отдельный вызов функции BreakUp() после функции Stop(), вот после этого поток уже можно запускать вызовом функции Start(). Причём, BreakUp() уже может вызваться вне зависимости от значения флага, в том числе, для отжатия стопора, зажатого мусорным флагом и не будет ошибкой в случае вызова при уже отжатом, в том числе, дефолтно, стопоре: ведь он только говорит, что после него запускать можно, но не требует немедленного запуска и, уж конечно, ничего не предотвращает. Хотя можно добавить проверку состояния и перед вызовом этой функции, но это уже на усмотрение. Может она должна включить электромагнит с втяжным якорем, или завезти насос для физического отжатия тормоза? Тогда опрос датчика состояния тормоза и обход вызова может сэкономить энергию, а можно опрос состояния и обход подачи управления на пускатель внести в саму функцию.
Psilon
Master of Orion
 Аватар для Psilon
5738 / 4686 / 619
Регистрация: 10.07.2011
Сообщений: 14,160
Записей в блоге: 5
Завершенные тесты: 4
07.06.2014, 12:13     Многопоточность, выход из бесконечного цикла c++11 #65
Цитата Сообщение от taras atavin Посмотреть сообщение
2.2. Предотвращение старта потока.
Нет, это уже другой функционал, за который должен отвечать другой метод. Лично для меня было бы неожиданностью, если бы Stop() стоящего потока не выдал бы исключение, а после старта ничего бы не сработало. Неужели это нормальное поведение по-вашему?
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
07.06.2014, 12:32     Многопоточность, выход из бесконечного цикла c++11 #66
Конечно. Только предупреждать надо, как и о том, что stop не предназначена для предотвращения старта.
Psilon
Master of Orion
 Аватар для Psilon
5738 / 4686 / 619
Регистрация: 10.07.2011
Сообщений: 14,160
Записей в блоге: 5
Завершенные тесты: 4
07.06.2014, 12:36     Многопоточность, выход из бесконечного цикла c++11 #67
taras atavin, Предотвращение старта - не является ожидаемым поведением, следовательно на это и рассчитывать не стоит.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
07.06.2014, 12:38     Многопоточность, выход из бесконечного цикла c++11 #68
1. Автомобиль достаточно туп, чтоб не предоставлять одним органом управления и даже одним агрегатом два функционала. Он даже может не иметь ни какой автоматики, кроме простейшего распределителя фаз зажигания и клапанов прямого действия по два на каждый цилиндр. Гидроусилитель руля появился вовсе не на первой самобеглой коляске, да и карты их вроде до сих пор не имеют.
2. Но если нажать тормоз на горке, а потом отцепить буксировочный канат, или нажать тормоз на горке, а потом выключить стояночный тормоз, то автомобиль не покатится.
Psilon
Master of Orion
 Аватар для Psilon
5738 / 4686 / 619
Регистрация: 10.07.2011
Сообщений: 14,160
Записей в блоге: 5
Завершенные тесты: 4
07.06.2014, 12:38     Многопоточность, выход из бесконечного цикла c++11 #69
taras atavin, возьмем в качестве независимого арбитра стандартную библиотеку .Net (т.к. во-первых она появилась позже и учла ошибки STL, а во-вторых исключения в .net намного активнее используются):
http://msdn.microsoft.com/ru-ru/libr...v=vs.110).aspx
Вызывает исключение ThreadAbortException в вызвавшем его потоке для того, чтобы начать процесс завершения потока. Вызов данного метода обычно завершает поток.

Исключения
  • SecurityException - У вызывающего объекта отсутствует необходимое разрешение.
  • ThreadStateException - Поток, находящийся в состоянии завершения, приостановлен.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
07.06.2014, 12:40     Многопоточность, выход из бесконечного цикла c++11 #70
Ога. В качестве арбитра низкоуровневую библиотеку.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.06.2014, 14:21     Многопоточность, выход из бесконечного цикла c++11
Еще ссылки по теме:

Выход из бесконечного цыкла C++
Отладка бесконечного цикла C++
C++ Способы остановки бесконечного while цикла

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Psilon
Master of Orion
 Аватар для Psilon
5738 / 4686 / 619
Регистрация: 10.07.2011
Сообщений: 14,160
Записей в блоге: 5
Завершенные тесты: 4
07.06.2014, 14:21     Многопоточность, выход из бесконечного цикла c++11 #71
taras atavin, а чем не пример? Метод Stop() должен делать Stop(). И я не должен лезть в его кишки, чтоб у знать, что он еще оказывается и ждет потока, чтобы его остановить, когда он стартанет. А метод, который это делает, должен называться как-нибудь StopWhenStart(bool stopIfAlreadyRunning = true) И вот тут уже подобное будет ожидаемым поведением.
Yandex
Объявления
07.06.2014, 14:21     Многопоточность, выход из бесконечного цикла c++11
Ответ Создать тему
Опции темы

Текущее время: 00:56. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru