6 / 6 / 0
Регистрация: 13.07.2013
Сообщений: 57
|
||||||
1 | ||||||
Организовать работу функции так, чтобы программа не дожидалась окончания её выполнения (многопоточность)24.12.2015, 13:11. Показов 1798. Ответов 20
Метки многопоточность (Все метки)
Всем привет. Только начинаю применять многопоточность. В нижеследующем коде нужно организовать таким образом, чтобы программа не дожидалась окончания функции LongFunc, а продолжала свою работу далее. Т.е. сейчас программа выводит только результат, а нужно чтобы пока результат не готов выводилось BlaBlaBla. Причём весь код для многопоточности нужно заключить внутрь класса A. Как бы это сделать?
0
|
24.12.2015, 13:11 | |
Ответы с готовыми решениями:
20
<omp.h> Организовать работу рабочих так, чтобы они копали траншею одновременно Организовать работу sms-сервиса так, чтобы познакомить каждого участника ровно с тем количеством других, сколько ему требуется Изменить for на while, но так, чтобы программа оставалась прежней, то есть выполняла ту же работу Проверка окончания выполнения функции |
Хитрая блондиночка $)
1472 / 988 / 399
Регистрация: 21.12.2015
Сообщений: 3,785
|
|
24.12.2015, 13:25 | 2 |
Ну внутрь класса не скажу, но вот поиск показывает следующее: Самый простой способ реализации двух параллельных потоков
0
|
6 / 6 / 0
Регистрация: 13.07.2013
Сообщений: 57
|
|
24.12.2015, 13:39 [ТС] | 3 |
Нет, нужно именно внутри класса, т.к. класс А будет выноситься в отдельную библиотеку и пользователю не нужно знать что там внутри происходит.
0
|
6 / 6 / 0
Регистрация: 13.07.2013
Сообщений: 57
|
|
24.12.2015, 15:56 [ТС] | 5 |
Croessmah, почему не позволит и куда эту строку вставить?
0
|
Неэпический
|
|
24.12.2015, 16:02 | 6 |
потому что, например,
if (a.GetStatus() != -1) может выполнится еще пару раз, прежде чем в другом потоке выполнится Status = -1 . Соответственно это приведет к запуску других потоков, а после того, как один из них поставит Status в единицу, получим еще запуск потоков, а потом завершится еще один поток и т.д. короче логика здесь явно не та. Лучше опишите что Вы хотите получить в результате.
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
||||||
24.12.2015, 16:09 | 7 | |||||
APXAHGEL, Ну можно как-то так...
0
|
Неэпический
|
||||||
24.12.2015, 16:17 | 8 | |||||
ForEveR, всё равно всё это как-то не так...
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
24.12.2015, 16:22 | 9 |
Croessmah, А фиг его знает, я особо не вглядывался. По хорошему sleep на секунду вполне дает изменять статусы как надо. В идеале нужно сделать по другому конечно.
0
|
Неэпический
|
|
24.12.2015, 16:32 | 10 |
Оно даст задержку при запуске потока, чтобы Status успел в -1 поставиться, но между двумя теми проверками нет никакой защиты, так что между ними может вклиниться поток и поставить статус в 1.
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
24.12.2015, 16:39 | 11 |
Croessmah, Тут по хорошему через future стоило бы делать.
Не по теме: Но мне как-то лень этим сейчас заниматься.
0
|
Croessmah
|
24.12.2015, 16:40
#12
|
0
|
6 / 6 / 0
Регистрация: 13.07.2013
Сообщений: 57
|
|
24.12.2015, 16:58 [ТС] | 13 |
Croessmah, ForEveR, наверное я про логику всё же не дописал. В общем должно быть как-то так: В основном потоке есть какой-то цикл. В этом цикле мы запускаем функцию LongFunc, которая запускается в отдельном потоке и основной поток продолжает выполняться не ожидая завершения работы этой функции. Функция работает в единственном экземпляре. На следующей итерации цикла основного потока мы проверяем через GetStatus завершилась ли работа функции LongFunc и если да, то считываем её результат через GetResult, печатаем его на экране и запускаем функцию LongFunc ещё раз, если нет выполняем какие-то действия (в данном случае печатаем BlaBlaBla). В теле функции main ничего дописывать не надо, т.к. класс А позже станет библиотекой и тот, кто будет им пользоваться не будет знать о его внутреннем устройстве.
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
||||||||||||||||
24.12.2015, 17:46 | 14 | |||||||||||||||
APXAHGEL, Это не корректно.
Добавлено через 3 минуты Как-то так можно. sleep в main добавлен чтобы не видеть миллионы строк.
Добавлено через 9 минут Хотя через thread будет попроще.
1
|
6 / 6 / 0
Регистрация: 13.07.2013
Сообщений: 57
|
||||||
25.12.2015, 13:39 [ТС] | 15 | |||||
ForEveR, Спасибо огромное за последний код, только вот хочу ещё уточнить, в GetStatus не нужно ли добавить каких синхронизаций/блокировок или ещё чего. И ещё, как нужно модифицировать код, чтобы из main при вызове LongFunc можно было передать в него параметры, ну к примеру так:
С передачей параметров разобрался, нужно просто вместо std::thread t([this]() написать std::thread t([this, Array, Multiplier](). Но всё-таки хочется узнать насчёт GetStatus и ещё такой момент, я как понимаю при каждом входе в функцию идёт новое создание потока, что выполняется достаточно долго. Можно ли, допустим, создать поток один раз в конструкторе класса и использовать его всё время?
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
||||||
25.12.2015, 13:53 | 16 | |||||
APXAHGEL, Каких синхронизаций/блокировок в функцию которая только возвращает статус?
Да, каждый раз идет создание потока. Можно создать в конструкторе конечно, но надо ведь дать потоку понять что пора работать/пора спать. Добавлено через 10 минут Можно что-нибудь типа такого.
0
|
6 / 6 / 0
Регистрация: 13.07.2013
Сообщений: 57
|
|
25.12.2015, 13:58 [ТС] | 17 |
ForEveR, я в многопоточности новичок, поэтому вопрос может быть глупым, но не может ли случиться ситуация, когда мы запрашиваем GetStatus из основного потока (в функции main) и одновременно с этим Status изменяется в другом потоки. Это вроде как состояние гонки называется и вроде Status тогда может вернуться вообще левым числом каким-то.
Это как выглядеть будет? По вызову LongFunc передавать в него параметры и запускать и чтобы останавливался по окончании работы.
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
25.12.2015, 14:10 | 18 |
APXAHGEL, Не должно тут возникнуть гонки по хорошему. А на тему примера - выше.
0
|
6 / 6 / 0
Регистрация: 13.07.2013
Сообщений: 57
|
|
25.12.2015, 15:08 [ТС] | 19 |
ForEveR, но в таком случае вспомогательный поток не будет усыпляться. Там постоянно будет вызываться if (!Run) continue;. Можно ли как-то его усыпить, чтобы он вообще не тратил процессорного времени? Условные переменные не из той оперы?
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|||||||||||
25.12.2015, 15:46 | 20 | ||||||||||
Сообщение было отмечено APXAHGEL как решение
Решение
APXAHGEL, Ну можно сделать через condition_variable.wait.
Добавлено через 16 минут Что-то вроде
0
|
25.12.2015, 15:46 | |
25.12.2015, 15:46 | |
Помогаю со студенческими работами здесь
20
Нужно сделать так чтобы при неправильном вводе программа не прекращала работу, а предлагала заново ввести значение N Программа не прекращает работу при выполнении условия окончания Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |