Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.93/15: Рейтинг темы: голосов - 15, средняя оценка - 4.93
0 / 0 / 0
Регистрация: 05.09.2016
Сообщений: 47

Алгоритм для многопоточности

06.09.2016, 12:49. Показов 3484. Ответов 63
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Мне нужно написать алгоритм реализации задач(как я думаю делать):
Написать консольную программу, которая выполняет поиск максимального элемента в массиве с 1000000000 элементов. Массив в начале программу можно инициализировать произвольным образом. Программа должна продемонстрировать следующие подходы к решению данной проблемы.
- Поиск использует только 1 поток.
- Поиск использует 2 потока.
- Поиск использует оптимальное количество потоков, которые можно запускать на данном компьютере.
- Программа выполняет поиск используя 20 потоков.

Подскажите реализацию алгоритма

Добавлено через 2 часа 40 минут
я как думаю делать:
можно поделить 1000000000 елементов на количество потоков и искать в каждом потоке макс а потом сравнить их,то есть если потоков 20 то поделить на 20 частей и потом сравнить эти 20 элементов . Хотя как по мне лучше отсортировать массив и взять последний элемент
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.09.2016, 12:49
Ответы с готовыми решениями:

Соотношение многопоточности приложения c++ и многопоточности на уровне системы?
Возник следующий вопрос: в C++ существует два варианта работы с многопоточностью - std::theard и использование mutex. Но, оба этих...

Написать алгоритм рекурсивного перебора папок в многопоточности с использованием Fork/Join Framework
Написать алгоритм рекурсивного перебора папок в многопоточности с использованием Fork/Join Framework

Наилучшее решение для реализации многопоточности
Здравствуйте. У меня есть класс. В нем процедуры, которые делают запросы к серверу, что занимает время и приложение подвисает. Было бы...

63
1443 / 1326 / 131
Регистрация: 20.03.2009
Сообщений: 4,689
Записей в блоге: 11
15.09.2016, 22:51
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от alexu_007 Посмотреть сообщение
Да тут функцией не обойдёшься.
Тут вы не правы. В Qt есть Map-Reduce. Нужно описать лишь функцию свертки.
0
3 / 3 / 0
Регистрация: 30.07.2014
Сообщений: 12
20.09.2016, 22:18
Автор пропал, но может зайдет увидет))
Решение вашей задачи скидываю . Я бы не разбивал на части вектор для потоков. А использовал бы Mutex, но я еще не разобрался нормально в нем. Если кто знает, можете подсказать парню как сделать Mutexом
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#include <QCoreApplication>
#include <QTime>
#include <QDebug>
#include "FindMaxInArrayThread.h"
 
struct Range
{
    Range(size_t start, size_t length);
 
    size_t mStart;
    size_t mLength;
};
 
Range::Range(size_t start, size_t length)
    : mStart(start)
    , mLength(length)
{}
 
void PrintRanges(const std::vector<Range>& ranges)
{
    for (size_t index = 0; index < ranges.size(); ++index)
    {
        qDebug()<< ranges[index].mStart << "," << ranges[index].mLength;
    }
}
 
std::vector<Range> GenerateRanges(size_t numElements, size_t numRanges)
{
    std::vector<Range> ranges;
    ranges.reserve(numRanges);
 
    const size_t minLength = numElements / numRanges;
    const size_t modulo = numElements % numRanges;
 
    for (size_t index = 0; index < modulo; ++index)
        ranges.push_back(Range(0, minLength + 1));
 
    for (size_t index = modulo; index < numRanges; ++index)
        ranges.push_back(Range(0, minLength));
 
    for (size_t index = 1; index < numRanges; ++index)
        ranges[index].mStart = ranges[index - 1].mStart + ranges[index - 1].mLength;
 
    return ranges;
}
 
void FindMax(const int elements[], const size_t numElements, const size_t numThreads)
{
    QTime time(QTime::currentTime());
    std::srand(time.msecsSinceStartOfDay());
 
    std::vector<QThread*> threads;
    threads.reserve(numThreads);
 
    std::vector<int> results(numThreads);
 
    const std::vector<Range> ranges = GenerateRanges(numElements, numThreads);
    for (size_t index = 0; index < numThreads; ++index)
        threads.push_back(new FindMaxInArrayThread(&elements[0], ranges[index].mStart, ranges[index].mLength, &results[index]));
 
    time.start();
    for (size_t index = 0; index < numThreads; ++index)
        threads[index]->start();
 
    for (size_t index = 0; index < numThreads; ++index)
        threads[index]->wait();
 
    const int maxValue = *std::max_element(results.begin(), results.end());
    const int elapsedMs = time.elapsed();
 
    qDebug() << "Elapsed time(ms): " << elapsedMs;
    qDebug() << "Result: " << maxValue << "\n";
 
    for (size_t index = 0; index < numThreads; ++index)
        delete threads[index];
}
 
int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);
 
    const size_t numElements  = 100000000;
    std::vector<int> elements;
    elements.reserve(numElements);
 
    for (size_t index = 0; index < numElements; ++index)
        elements.push_back(std::rand() % numElements);
 
    int  idealThreadCount = QThread::idealThreadCount();
 
    qDebug() << "One Thread:";
    FindMax(&elements[0], numElements, 1);
 
    qDebug() << "Two Thread:";
    FindMax(&elements[0], numElements, 2);
 
    qDebug() << "Optimal Thread: ";
    qDebug() <<"Ideal Thread Count:" << idealThreadCount;
    FindMax(&elements[0], numElements, idealThreadCount);
 
    qDebug() << "Twenty Thread: ";
    FindMax(&elements[0], numElements, 20);
    return app.exec();
}
1
12 / 9 / 1
Регистрация: 08.08.2016
Сообщений: 45
21.09.2016, 10:50
Цитата Сообщение от pashkevych Посмотреть сообщение
Я бы не разбивал на части вектор для потоков. А использовал бы Mutex, но я еще не разобрался нормально в нем.
Суть задачи в том что бы понять как оптимально рассчитать число потоков, и распараллелить работу потоков. В том что бы научиться создавать потоки, организовать их параллельную работу и доступ к данным. Что бы увидеть что число потоков должно соответствовать числу ядер процессора. Меньше - плохо, простаивает проц, больше - плохо, тратится лишенее время на переключения между потоками.

Что Вы добьетесь мьютексом? Разделяемым ресурсом может быть только массив, но если вы его блокируете мьютексом, то у вас не будет параллельной обработки данных. И все будет работать медленнее чем в одном потоке (затраты на переключения).
Нужно организовать одновременный доступ к разным кускам массива, т.е. каждый поток работает на своем куске и не лезет в соседний кусок.
0
3 / 3 / 0
Регистрация: 30.07.2014
Сообщений: 12
21.09.2016, 13:29
Юрий Петренко, ну так правильно, у меня в коде основной поток ждет всех что бы сделать операцию найти максимум с всех потоков. И это не есть гуд как по мне. Луче было бы чтобы этот максимум сразу записывали потоки . И не делать лишнюю операцию
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.09.2016, 13:29

Помогите алгоритм для char переделать в алгоритм для float
char* DecToBin(char x, char* str) { int i; for (i = sizeof(x)*8-1; i&gt;=0; i--) { str = (x&amp;1 == 1) ? '1' : '0'; x = x &gt;&gt;...

Построить алгоритм ДО и алгоритм ПОКА для вычислений значения функции на отрезке [a,b] с шагом h.
Построить алгоритм ДО и алгоритм ПОКА для вычислений значения функции на отрезке с шагом h. Написать программу: F=3+tgx Мой...

Составить алгоритм-вычисление квадрата суммы двух чисел и алгоритм для вычисления функции
Здравствуйте!Мне нужно все с самого начала и точно,помогите пожалуйста! 1.составить алгоритм-вычисление квадрата суммы двух чисел.

Кто может составить алгоритм по проге? Алгоритм нужен для отчета если вам это интересно)
uses crt; var a:array of integer; b:array of integer; i,j,m,n:integer; begin ClrScr; Randomize; Write('n='); Readln(n); ...

по многопоточности
У меня есть анимация переходов... я её применил на боди и футер так сказать.. как сделать чтобы этот код выполнялся синхронно? public...


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

Или воспользуйтесь поиском по форуму:
64
Ответ Создать тему
Новые блоги и статьи
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru