148 / 139 / 18
Регистрация: 13.10.2012
Сообщений: 592
|
|||||||||||
1 | |||||||||||
Запуск нескольких независимых потоков. Дождаться завершения всех (C++ 11)03.07.2014, 02:23. Показов 10265. Ответов 14
Метки нет (Все метки)
Доброго времени суток.
Подскажите, как запустить несколько независимых потоков, но дождаться, пока все завершатся? В каждом потоке есть функция bool sort(int** matrix, int row), которая рекурсивно вызывает себя, передавая матрицу и номер строки с шагом в количество потоков. Размер матрицы - глобальная константа size. Использую std::future Пытался ожидать, пока все потоки вернут true (std::future::get()), но тогда программы выполняется с той же скоростью, что и в одном потоке. Если ожидать возвращение true только от последнего потока - массив не всегда отсортирован (что вполне логично). Как правильно сделать мультипотоковую сортировку? Как дождаться завершения всех потоков? Чуть подробнее
Есть простая программа для сортировки матрицы. Имеются 3 константы:
Затем создаются 4 независимых потока, которые сортируют. Затем жду завершения и вывожу время выполнения.
0
|
03.07.2014, 02:23 | |
Ответы с готовыми решениями:
14
Как дождаться завершения потока? Как дождаться завершения нескольких потоков Правильно создать пул потоков, запустить эти потоки одновременно и дождаться их завершения Можно ли ждать завершения одновременно сразу нескольких потоков? |
What a waste!
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
|
|
03.07.2014, 04:44 | 2 |
MastAKK, эмм, а thread::join не подходит?
0
|
327 / 230 / 55
Регистрация: 30.05.2014
Сообщений: 682
|
|
03.07.2014, 06:13 | 3 |
IMHO - Для таких задач OpenMP покрывает явную организацию потоков как бык овцу.
2
|
148 / 139 / 18
Регистрация: 13.10.2012
Сообщений: 592
|
|
03.07.2014, 12:00 [ТС] | 4 |
gray_fox, так thread::join вроде приостанавливает основной поток до завершения нового?
0
|
03.07.2014, 12:28 | 7 |
Ну да в русском я как енот полоскун в квантовой электродинамике. Скажем так поток ожидает завершения присоедененного потока прежде чем завершиться самому. Момент... суть в том, что основной поток будет выполнять код и после строчки thread::join() т.е. он не приостанавливается, а продолжает выполняться далее пока не встретит точку выхода где и будет ждать завершения присоедененного потока. Как то так.
0
|
03.07.2014, 13:31 | 10 | |||||
Можно вылавливать на future готовые результаты в цикле. Результаты будем получать в порядку завершения потоков. Вот надуманный пример:
Вообще, параллельную сортировку очень сложно реализовать. Пример есть в моем блоге.
0
|
327 / 230 / 55
Регистрация: 30.05.2014
Сообщений: 682
|
||||||
03.07.2014, 14:12 | 11 | |||||
Это если сортировать одну последовательность в несколько потоков. А в исходной постановке:
Это делается одной строкой.
0
|
383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
|
|
04.07.2014, 00:46 | 12 |
uglyPinokkio, а ваша одна строка будет везде работать? Сомневаюсь
0
|
327 / 230 / 55
Регистрация: 30.05.2014
Сообщений: 682
|
|
04.07.2014, 06:56 | 13 |
Естественно, работать она будет для компиляторов, поддерживающих OpenMP. ms и gcc на linux и windows поддерживают.
Добавлено через 1 час 26 минут http://openmp.org/wp/openmp-compilers/
1
|
383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
|
|
04.07.2014, 19:12 | 14 |
uglyPinokkio, просто прагмы не очень хороший стиль
0
|
327 / 230 / 55
Регистрация: 30.05.2014
Сообщений: 682
|
|
04.07.2014, 19:18 | 15 |
Для того, что бы одной строкой распараллелить вычисления по количеству ядер в среде исполнения, я согласен на некоторый ущерб своему чувству прекрасного.
0
|
04.07.2014, 19:18 | |
04.07.2014, 19:18 | |
Помогаю со студенческими работами здесь
15
Ожидание завершения всех потоков Завершения приложения и заверщения всех потоков Как подождать завершения нескольких потоков, и если после минуты не завершились продолжать выполнение? Запуск нескольких потоков Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |