36 / 36 / 2
Регистрация: 28.04.2013
Сообщений: 110
|
|||||||||||
1 | |||||||||||
Многопоточность, выход из бесконечного цикла c++1103.06.2014, 23:06. Показов 5560. Ответов 70
Метки нет (Все метки)
Всем привет. Я в задачах многопоточности - новичок (начал ей заниматься буквально несколько часов назад), инфу искал, читал, но как-то пока не помогает.
Столкнулся с задачей (с++11 std::thread) код не оригинальный, а упрощённый, чтобы показать саму суть, подразумевается, что все необходимые include'ы уже есть. есть
Проблема: someThread не останавливает работу функции infinite. Цикл так и продолжает крутиться, выполняются do things и show window. Вопрос: Как завершить цикл ?
0
|
03.06.2014, 23:06 | |
Ответы с готовыми решениями:
70
Выход из бесконечного цикла Выход из бесконечного цикла по нажатию кнопки. Выход из бесконечного цикла Выход из бесконечного цикла |
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
|
|||||||||||
04.06.2014, 00:52 | 2 | ||||||||||
Присвоить _stopCycle true.
Добавлено через 37 минут
0
|
36 / 36 / 2
Регистрация: 28.04.2013
Сообщений: 110
|
||||||
04.06.2014, 08:33 [ТС] | 3 | |||||
у меня ошибка в оригинальном посте
0
|
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
|
|
04.06.2014, 12:19 | 4 |
Я показал, как можно сделать, чтобы не крутился.
Добавлено через 2 минуты У вас крутится потому, что obj.stop() (в главном потоке) происходит раньше, чем _stopCycle = false во втором потоке.
0
|
36 / 36 / 2
Регистрация: 28.04.2013
Сообщений: 110
|
|
04.06.2014, 12:26 [ТС] | 5 |
alsav22, я сильно сомневаюсь в том что obj.stop() происходит раньше старта, к сожалению, сейчас исходников нет, я проверить не смогу, но я полагаю что работает это так:
1. у меня происходит запуск потока с циклом 2. Основной поток в этот момент начинает считывать команды с консоли 3. stop() вызывается только, когда в консоль придёт соответствующая команда (цикл уже стартовал) ... читая описание, я не совсем понял как работает detach(), если не трудно объясните попроще, join() как я понимаю блокирует вызывающий поток до завершения функции, detach() отсоединяет вызванный поток от вызывающего, правильно ?
0
|
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
|
||||||
04.06.2014, 12:38 | 6 | |||||
Полагать можно всё что угодно. Работа вашего кода показывает, что ваши предположения неверны. Сделайте паузу в остновном потоке (как у меня в первом коде), чтобы второй поток успел дойти до _stopCycle = false, тогда можно уже будет рассуждать.
Это к вопросу о зацикливании отношения не имеет, читайте документацию. Добавлено через 2 минуты Вот этот кусок нормальный выложите, чтобы можно было проверить работу:
0
|
2835 / 1644 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
|
|
04.06.2014, 12:40 | 7 |
Думаю, так как _stopCycle в цикле нигде не изменяется, условие в while оптимизиуется до true. Надо заменить bool на std::atomic<bool> (а не volatile bool, кстати).
0
|
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
|
|
04.06.2014, 12:57 | 8 |
volatile чем не устраивает?
В первом моём коде (где пауза делается в основном потоке) зацикливания нет (даже без volatile), если убрать паузу, то есть. Вывод? Добавлено через 1 минуту И не одна. Добавлено через 7 минут Но это всё рассуждения относительно моего кода. У ТС может и другая быть причина (связанная с оптимизацией или с чем другим), но проверить нет возможности из-за непонятного куска кода.
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
04.06.2014, 13:01 | 9 |
0
|
36 / 36 / 2
Регистрация: 28.04.2013
Сообщений: 110
|
|
04.06.2014, 13:06 [ТС] | 10 |
0
|
2835 / 1644 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
|
|
04.06.2014, 13:07 | 11 |
Такое использование volatile не соответствует стандарту.
http://alenacpp.blogspot.ru/2006/04/volatile.html (И на форуме уже где-то об этом писалось.) Сейчас уже и M$ это не рекомендует.
0
|
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
|
|
04.06.2014, 13:15 | 12 |
А заход в while(), где этот if?
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
04.06.2014, 13:20 | 13 |
Была у меня как то проблема межпоточного взаимодействия, выглядело поведение проги так, как если бы два потока работали с отдельными копиями переменных. Может в этом дело?
0
|
2835 / 1644 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
|
|
04.06.2014, 13:24 | 15 |
Вывод: правильность кода не является необходимым условием для правильности его работы, не более того.
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
04.06.2014, 13:46 | 17 |
0
|
2835 / 1644 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
|
|
04.06.2014, 14:00 | 18 |
0
|
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
|
||||||
04.06.2014, 16:01 | 19 | |||||
В моём, первом (если убрать паузу в основном потоке).
Об этом и речь нигде не идёт...
Во втором потоке. Добавлено через 1 час 12 минут el_gato_de_Ch, попробуйте, в своём коде, вот так сделать:
0
|
2835 / 1644 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
|
|
04.06.2014, 18:38 | 20 |
Действительно, obj.stop() может выполниться раньше, чем _stopCycle = false. При первом запуске у меня этого не произошло, и я не обратил внимания. Но зацикливается не всегда, а как повезёт (у меня, например, с включенным антивирусом зацикливается реже, чем с выключенным). (Однако всего предыдущего про оптимизацию условия и volatile это не отменяет.)
0
|
04.06.2014, 18:38 | |
04.06.2014, 18:38 | |
Помогаю со студенческими работами здесь
20
Выход из бесконечного цикла Выход из бесконечного цикла Выход из бесконечного цикла Выход из бесконечного цикла программно Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |