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

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

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

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

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

Добавлено через 2 часа 40 минут
я как думаю делать:
можно поделить 1000000000 елементов на количество потоков и искать в каждом потоке макс а потом сравнить их,то есть если потоков 20 то поделить на 20 частей и потом сравнить эти 20 элементов . Хотя как по мне лучше отсортировать массив и взять последний элемент
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.09.2016, 12:49
Ответы с готовыми решениями:

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

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

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

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

63
12 / 9 / 1
Регистрация: 08.08.2016
Сообщений: 45
14.09.2016, 16:08 41
Author24 — интернет-сервис помощи студентам
Да.
0
0 / 0 / 0
Регистрация: 05.09.2016
Сообщений: 47
14.09.2016, 16:18  [ТС] 42
Юрий Петренко, ок
main

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
#include <QCoreApplication>
#include "Worker.h"
#include <iostream>
#include <QThread>
#include <QTime>
 
typedef unsigned long long size_t;
int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);
    QThread thread;
    Worker oneThread;
 
    QTime time = QTime::currentTime();
    size_t size = 1000;
    int* array = new int[size];
    for (int index = 0; index < size; ++index)
    {
        array[index] = rand() % size + 1;
    }
    std::cout << "Max: " << oneThread.getMax(array, 0, size) << std::endl;// я правильно  тут делаю?
    int msec = time.msecsTo( QTime::currentTime() );
    std::cout << "Run time: " << msec << std::endl;
    QObject::connect(&thread,SIGNAL(started()),&oneThread,SLOT(getMax(int array[], int firstIndex, int lastIndex));// и тут
 
    QObject::connect(&oneThread,SIGNAL(finished()),&thread,SLOT(terminate()));
    oneThread.moveToThread(&thread);
 
    oneThread.run();// у меня  же  run() нету,  что  тут  вместо єтой функции?
    return app.exec();
}
0
12 / 9 / 1
Регистрация: 08.08.2016
Сообщений: 45
14.09.2016, 16:36 43
Есть несколько ошибок, в итоге могу сказать тебе что поток ты пока не запустил.
Можешь ответить почему ты думаешь что запустил поток? Какая строка должна была по твоему это сделать?

Добавлено через 2 минуты
Пардон не заметил комменты. Да там неправильно.

Добавлено через 4 минуты
Цитата Сообщение от stasJun Посмотреть сообщение
std::cout << "Max: " << oneThread.getMax(array, 0, size) << std::endl;// я правильно тут делаю?
эта строка просто не нужна.

Цитата Сообщение от stasJun Посмотреть сообщение
QObject::connect(&thread,SIGNAL(started()),&oneThread,SLOT(getMax(int array[], int firstIndex, int lastIndex));// и тут
суть ты уловил правильно, но вот здесь и есть основная проблема. Потом обсудим эту строку (переделаем).
сначала нужно понять, как же запускается поток.
А для этого нужно разобраться с этим вопросом:
Цитата Сообщение от stasJun Посмотреть сообщение
oneThread.run();// у меня же run() нету, что тут вместо єтой функции?
0
0 / 0 / 0
Регистрация: 05.09.2016
Сообщений: 47
14.09.2016, 16:37  [ТС] 44
Юрий Петренко,
я думаю так
thread.start();
0
12 / 9 / 1
Регистрация: 08.08.2016
Сообщений: 45
14.09.2016, 17:00 45
Поток запускается так:
thread.start();

Добавлено через 3 минуты
про event loop - знаешь?
0
0 / 0 / 0
Регистрация: 05.09.2016
Сообщений: 47
14.09.2016, 17:05  [ТС] 46
Юрий Петренко, нет
0
12 / 9 / 1
Регистрация: 08.08.2016
Сообщений: 45
14.09.2016, 17:56 47
Вобщем у каждого потока есть цикл событий (event loop)
Цикл событий - просто бесконечно выполняющийся цикл, в котором поток ждет сигнал о завершении своей работы.
Так же он накапливает события на которые подписаны принадлежащие ему объекты.

После того как ты сделаешь QThread::start() поток запустится.
Вызовется функция QThread::run(); которая вызовет QThread::exec(), которая запустит тот самый eventloop.
Так же сгенерируется событие started() (то на которое мы подписались (там где connect....)).

После того как поток запущен, у него формируется очередь событий и сигнал будет ждать в eventLoop того QThread в которы был размещен получатель.
Мы приконнектили слот getMax , к сигналу о запуске потока started(). Поток стартанул, сгенерировал сигнал started(), слоты подписанные на него стали исполняться.
Понятно?
0
0 / 0 / 0
Регистрация: 05.09.2016
Сообщений: 47
14.09.2016, 17:57  [ТС] 48
Юрий Петренко, да, но мы еще не приконектили, нужно конект изменить
0
12 / 9 / 1
Регистрация: 08.08.2016
Сообщений: 45
14.09.2016, 18:15 49
Правильно. Для этого нам нужно что бы сигнатура слота и сигнала совпали.
Значит
1)либо нам нужен другой сигнал, который передаст эти три параметра в слот.
2)либо нам нужно эти параметры слота сделать полями класса, и передавать их при инициализации через конструктор.
И переделать getMax(); что бы нужные ему параметры он брал из объекта.
0
0 / 0 / 0
Регистрация: 05.09.2016
Сообщений: 47
14.09.2016, 18:18  [ТС] 50
Юрий Петренко, я что проще сделать?
я думаю 2 вариант можна сделать.
но как не знаю это сделать)
0
12 / 9 / 1
Регистрация: 08.08.2016
Сообщений: 45
14.09.2016, 18:31 51
Да ты же уже это делал.
0
0 / 0 / 0
Регистрация: 05.09.2016
Сообщений: 47
14.09.2016, 19:03  [ТС] 52
Юрий Петренко, честно, я незнаю как сделать, может и знаю но думаю что незнаю)

Добавлено через 26 минут
Юрий Петренко, а когда я такое делал?
0
12 / 9 / 1
Регистрация: 08.08.2016
Сообщений: 45
14.09.2016, 19:11 53
Посмотри 14 сообщение в этой теме, там ты передаешь в конструктор параметр.
0
0 / 0 / 0
Регистрация: 05.09.2016
Сообщений: 47
14.09.2016, 19:15  [ТС] 54
Юрий Петренко, Я знаю как передавать, а от какие передавать я незнаю
0
12 / 9 / 1
Регистрация: 08.08.2016
Сообщений: 45
14.09.2016, 19:26 55
а ну так те которые передаешь в слот getMax, т.е. создай в Worker три поля: int* -указатель на массив, int - начало отрезка в котором ищешь и itn -конец. И передавай их в конструкторе. И пусть getMax пользуется этими полями, а не локальными переменными. Т.е. раньше слот был getMax(int*, int, int) , должен стать getMax().
0
3 / 3 / 0
Регистрация: 30.07.2014
Сообщений: 12
14.09.2016, 22:33 56
stasJun, можно сделать так(не используя конекты):
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#ifndef FIND_MAX_IN_ARRAY_THREAD_H
#define FIND_MAX_IN_ARRAY_THREAD_H
 
#include <QThread>
 
class FindMaxInArrayThread : public QThread
{
    Q_OBJECT
public:
    FindMaxInArrayThread(const int array[], size_t startIndex, size_t numElements, int* result);
    virtual void run();
 
private:
    const int* mArray;
    size_t mStartIndex;
    size_t mNumElements;
    int* mResult;
};
 
#endif // FIND_MAX_IN_ARRAY_THREAD_H
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include "FindMaxInArrayThread.h"
#include <algorithm>
 
FindMaxInArrayThread::FindMaxInArrayThread(const int array[], size_t startIndex, size_t numElements, int* result)
    : mArray(array)
    , mStartIndex(startIndex)
    , mNumElements(numElements)
    , mResult(result)
{
}
 
void FindMaxInArrayThread::run()
{
    const int* it = mArray + mStartIndex;
    const int* itEnd = it + mNumElements;
    const int* maxIt = std::max_element(it, itEnd);
    *mResult = *maxIt;
}
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
#include <QCoreApplication>
#include <QTime>
#include <QDebug>
#include "FindMaxInArrayThread.h"
 
int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);
 
    QTime time(QTime::currentTime());
    std::srand(time.msecsSinceStartOfDay());
 
    const size_t numElements = 10000000;
    int* elements = new int[numElements];
    for (size_t index = 0; index < numElements; ++index)
        elements[index] = std::rand() % numElements;
 
    int result = 0;
    FindMaxInArrayThread maxInArrayThread(elements, 0, numElements, &result);
 
    time.start();
    maxInArrayThread.start();
    maxInArrayThread.wait();
    int elapsedMs = time.elapsed();
 
    qDebug() << "Elapsed time(ms): " << elapsedMs;
    qDebug() << "Result: " << result;
    delete[] elements;
 
    return app.exec();
}
1
0 / 0 / 0
Регистрация: 05.09.2016
Сообщений: 47
15.09.2016, 13:56  [ТС] 57
Юрий Петренко, pashkevych, а с 2 потоками как делать?
0
12 / 9 / 1
Регистрация: 08.08.2016
Сообщений: 45
15.09.2016, 17:49 58
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
#include <QCoreApplication>
#include <QTime>
#include <QDebug>
#include "FindMaxInArrayThread.h"
 
int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);
 
    QTime time(QTime::currentTime());
    std::srand(time.msecsSinceStartOfDay());
 
    const size_t numElements = 10000000;
    int* elements = new int[numElements];
    for (size_t index = 0; index < numElements; ++index)
        elements[index] = std::rand() % numElements;
 
    //здесь получить с консоли число потоков N
    //разделить массив на N кусков 
    int result = 0; //вместо этого заведи масив на N элементов сюда будешь писать result
    FindMaxInArrayThread maxInArrayThread(elements, 0, numElements, &result); //создать N таких объектов
    //передавай сюда массив и границы поиска (отрезок массива), и куда писать результат
 
    time.start();
    maxInArrayThread.start();   //стартуешь каждый из N потоков
    maxInArrayThread.wait();    //ждешь каждый из N потоков
    
    //сюда добавь метод который найдет в массиве результатов максимальное.
    
    int elapsedMs = time.elapsed();
 
    qDebug() << "Elapsed time(ms): " << elapsedMs;
    qDebug() << "Result: " << result;
    delete[] elements;
 
    return app.exec();
}
см. комментарии
0
0 / 0 / 0
Регистрация: 05.09.2016
Сообщений: 47
15.09.2016, 19:46  [ТС] 59
Юрий Петренко, спасибо
что вы имеете введупод :
//здесь получить с консоли число потоков N - я думал сколько потоков создам , столько и будет
//разделить массив на N кусков - а как это сделать?
создал масив:
C++ (Qt)
1
 int* result = new  int[2];
Добавлено через 7 минут
Ось мои наброски , как я думаю делать

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
#include <QCoreApplication>
#include <QTime>
#include <QDebug>
#include "FindMaxInArrayThread.h"
 
int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);
 
    QTime time(QTime::currentTime());
    std::srand(time.msecsSinceStartOfDay());
 
    const size_t numElements = 10000000;
    int* elements = new int[numElements];
    for (size_t index = 0; index < numElements; ++index)
        elements[index] = std::rand() % numElements;
 
    int numberThread = 2;
    int* result = new  int[numberThread];
    const size_t divElements = numElements / numberThread;
    
    FindMaxInArrayThread maxInArrayThread1(elements, 0, divElements, &result);
    FindMaxInArrayThread maxInArrayThread2(elements, divElements, numElements, &result);
 
    time.start();
    for (size_t index = 0; index < numElements; ++index)
    {
        maxInArrayThread1.start();
        maxInArrayThread2.start();
        
    }
    
    for (size_t index = 0; index < numElements; ++index)
    {
        maxInArrayThread1.wait();
        maxInArrayThread2.wait();
        
    }
    if (maxInArrayThread1 > maxInArrayThread2)
        result = maxInArrayThread1;
    else
        result = maxInArrayThread2;
    
    int elapsedMs = time.elapsed();
 
    qDebug() << "Elapsed time(ms): " << elapsedMs;
    qDebug() << "Result: " << result;
    delete[] elements;
 
    return app.exec();
}
0
3 / 3 / 0
Регистрация: 30.07.2014
Сообщений: 12
15.09.2016, 21:45 60
stasJun, на вскидку написал код:
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
#include <QCoreApplication>
#include <QTime>
#include <QDebug>
#include "FindMaxInArrayThread.h"
 
int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);
 
    QTime time(QTime::currentTime());
    std::srand(time.msecsSinceStartOfDay());
 
    const size_t numElements = 100000001;
    int* elements = new int[numElements];
    for (size_t index = 0; index < numElements; ++index)
        elements[index] = std::rand() % numElements;
 
    const int numberThreads = 2;
    int* results = new int[numberThreads];
    size_t divElements  = 0;
    int oElements = numElements % numberThreads;
    if (oElements == 0) 
        divElements = numElements / numberThreads;
 
    FindMaxInArrayThread maxInArrayThread1(elements, 0, divElements, results);
    FindMaxInArrayThread maxInArrayThread2(elements, divElements, divElements + oElements , results + 1);
 
    time.start();
 
    maxInArrayThread1.start();
    maxInArrayThread2.start();
 
    maxInArrayThread1.wait();
    maxInArrayThread2.wait();
 
    int elapsedMs = time.elapsed();
 
    qDebug() << "Elapsed time(ms): " << elapsedMs;
    qDebug() << "Result: " << std::max(results[0], results[1]);
    delete[] elements;
    delete[] results;
 
    return app.exec();
}
Относительно этой части кода я не уверен, боюсь что может не всегда сработать
C++ (Qt)
1
2
3
4
5
6
int oElements = numElements % numberThreads;
    if (oElements == 0) 
        divElements = numElements / numberThreads;
 
    FindMaxInArrayThread maxInArrayThread1(elements, 0, divElements, results);
    FindMaxInArrayThread maxInArrayThread2(elements, divElements, divElements + oElements , results + 1);
1
15.09.2016, 21:45
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.09.2016, 21:45
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru