Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.94
NEvOl
19 / 18 / 0
Регистрация: 13.08.2012
Сообщений: 726
#1

Многопоточность при сортировке массивов - C++

13.04.2014, 22:11. Просмотров 2443. Ответов 84
Метки нет (Все метки)

Уважаемые, столкнулся с ситуацией, имею 3 массива, содержимое которых одинаково (координаты точек в 3д пространстве), произвожу сортировку каждого массива по определенному измерению (x, y, z), хотел спросить, можно ли как-то ускорить процесс, возникла идея многопоточности (т.е. одновременно выполнять сортировку 3-х массивов), но я не уверен что я корректно мыслю т.к. не разу не сталкивался с многопоточностью, подскажите как правильно ?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.04.2014, 22:11     Многопоточность при сортировке массивов
Посмотрите здесь:

Не могу найти ошибку при сортировке массивов - C++
Даны два числа n и m и два упорядоченных по неубыванию массива A<=A<=....<=A и B<=B<=....<=B. Образовать из элементов этих массивов новый...

Почему программа падает при сортировке массивов больших размерностей - C++
Добрый день! Подскажите почему прога крашится при размере массива 10000, при значении 1000 все прекрасно работает. #include <iostream> ...

Задача по сортировке массивов - C++
Используя метод сортировки выбором, переставить элементы так, чтобы непарные элементы оставались на своих местах, а парные стояли по...

Ошибка при сортировке - C++
При сортировке массива вылетает причем именно на последнем числе сортирую так : for (int i=0;i<count;i++) { if (a>a) { ...

Ошибка при сортировке пузырьком - C++
Видимо выход за предел массива, не пойму где ошибка #include <iostream> #include <ctime> #include <cstdlib> using...

Ошибка при сортировке Шелла - C++
Сортирую массив, вношу в него 46 элементов случайных значений в диапазоне от 1 до 26, после сортирую методом Шелла, но выдает ошибку, не...

Не совсем корректный вывод при сортировке - C++
В скриншоте видно что у меня с файла выводит имя цветка, цвет, количество цветов(этот параметр выводит как текстовое значение, хотя в файле...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
NEvOl
19 / 18 / 0
Регистрация: 13.08.2012
Сообщений: 726
18.04.2014, 11:55  [ТС]     Многопоточность при сортировке массивов #46
Цитата Сообщение от newbie666 Посмотреть сообщение
профайлерами
это что за зверь ?
newbie666
Заблокирован
18.04.2014, 12:19     Многопоточность при сортировке массивов #47
Цитата Сообщение от NEvOl Посмотреть сообщение
это что за зверь ?
ну в гугЛь вбей С++ профайлеры
В основном это штуковины для анализа производительности программ.
В VisualStudio есть встроенный -
Цитата Сообщение от newbie666 Посмотреть сообщение
Запускай из меню ANALIZE->StartPerformenceAnalize
NEvOl
19 / 18 / 0
Регистрация: 13.08.2012
Сообщений: 726
18.04.2014, 23:32  [ТС]     Многопоточность при сортировке массивов #48
странно как-то этот анализ работает, запускаю его программа секунд 10-15 поработает, до конца не дойдет и вырубается он.

Добавлено через 26 минут
что еще интересно это то что, анализ так себя ведет именно тогда когда я выбираю сортировку с 3-мя потоками (когда очень долго выполняется ~1000 с) а когда выбираю сортировку 1-им потоком то все норально, жесть какая-то непонятная

Добавлено через 4 часа 43 минуты
newbie666, объясните пожалуйста как получить указатель на метода класса ? что бы указать для потоку ее в качестве функции потока.
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
19.04.2014, 10:54     Многопоточность при сортировке массивов #49
Цитата Сообщение от NEvOl Посмотреть сообщение
что бы указать для потоку ее в качестве функции потока.
Передать указатель на метод в поток не получится, но можно передать в поток функтор, в котором будет вызываться данный метод.
NEvOl
19 / 18 / 0
Регистрация: 13.08.2012
Сообщений: 726
19.04.2014, 11:02  [ТС]     Многопоточность при сортировке массивов #50
что-то типа обвертки ? я пробую так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class nodeKdTree
{
    public:
    nodeKdTree *right;
    nodeKdTree *left;
    int rNum;
    int lNum;
    int numInArr;
    photon pht;
    int key;//1 - x 2 - y 3 - z
    void CreateTree(photon *p, nodePhoton *newP, int num, int iStart, int rootIndex, int iBranch);
    nodeKdTree GetThisPointer();
};
 
void CreateTreeWrap(nodeKdTree &node, photon *p, nodePhoton *newP, int num, int iStart, int rootIndex, int iBranch)
{
    node.CreateTree(p, newP, num, iStart, rootIndex, iBranch);
}
 
nodeKdTree nodeKdTree::GetThisPointer()
{
    return *this;
}
пытаюсь вызывать так:
C++
1
std::thread th1(CreateTreeWrap, this->GetThisPointer(), lz, newP, lnum, iStart, newIndex, -1);
но ошибку кидает:
1 IntelliSense: no instance of constructor "std::thread::thread" matches the argument list
argument types are: (void (nodeKdTree &node, photon *p, nodePhoton *newP, int num, int iStart, int rootIndex, int iBranch), nodeKdTree, photon *, nodePhoton *, int, int, int, int) c:\filtering1\Filtering\kdTree.h 229
(функция nodeKdTree::CreateTree) должна вызываться рекурсивно.
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
19.04.2014, 11:11     Многопоточность при сортировке массивов #51
Цитата Сообщение от NEvOl Посмотреть сообщение
что-то типа обвертки ?
"Что-то типа" функтора.
NEvOl
19 / 18 / 0
Регистрация: 13.08.2012
Сообщений: 726
19.04.2014, 11:56  [ТС]     Многопоточность при сортировке массивов #52
alsav22, на сколько я понял в функторах перегружается оператор (), я реализовал так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class nodeKdTree
{
    public:
    nodeKdTree *right;
    nodeKdTree *left;
    int rNum;
    int lNum;
    int numInArr;
    photon pht;
    int key;//1 - x 2 - y 3 - z
    void CreateTree(photon *p, nodePhoton *newP, int num, int iStart, int rootIndex, int iBranch);
    void operator() (photon *p, nodePhoton *newP, int num, int iStart, int rootIndex, int iBranch)
    {
        this->CreateTree(p, newP, num, iStart, rootIndex, iBranch);
    }
    nodeKdTree GetThisNode();
};
 
void CreateTreeWrap(nodeKdTree node, photon *p, nodePhoton *newP, int num, int iStart, int rootIndex, int iBranch)
{
    node(p, newP, num, iStart, rootIndex, iBranch);
}
так ?

Добавлено через 8 минут
использование шаблонов ведь не обязательно ?
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
19.04.2014, 12:03     Многопоточность при сортировке массивов #53
Цитата Сообщение от NEvOl Посмотреть сообщение
так ?
Так.
NEvOl
19 / 18 / 0
Регистрация: 13.08.2012
Сообщений: 726
19.04.2014, 12:06  [ТС]     Многопоточность при сортировке массивов #54
alsav22, но при попытке использовать
C++
1
void CreateTreeWrap(nodeKdTree node, photon *p, nodePhoton *newP, int num, int iStart, int rootIndex, int iBranch)
в качестве поточной функции, т.е. так:
C++
1
std::thread th1(CreateTreeWrap, left, lz, newP, lnum, iStart, newIndex, -1);
то ывбрасывает ошибку:
1 IntelliSense: no instance of constructor "std::thread::thread" matches the argument list
argument types are: (void (nodeKdTree node, photon *p, nodePhoton *newP, int num, int iStart, int rootIndex, int iBranch), nodeKdTree *, photon *, nodePhoton *, int, int, int, int) c:\filtering1\Filtering\kdTree.h 233
я не пойму почему.
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
19.04.2014, 12:20     Многопоточность при сортировке массивов #55
Цитата Сообщение от NEvOl Посмотреть сообщение
т.е. так:
То есть, не так. Я же написал, что можно передать в поток:
Цитата Сообщение от alsav22 Посмотреть сообщение
но можно передать в поток функтор,
Функтор - это объект класса, в котором и т.д.

Добавлено через 1 минуту
Создавайте объект nodeKdTree и передавайте его в поток вместе с параметрами для nodeKdTree::operator().

Добавлено через 5 минут
В потоке будет вызываться то, что вызывается в nodeKdTree::operator().
NEvOl
19 / 18 / 0
Регистрация: 13.08.2012
Сообщений: 726
19.04.2014, 12:36  [ТС]     Многопоточность при сортировке массивов #56
alsav22, честно говоря я плохо понимаю пока функторы, я сделал так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class nodeKdTree
{
    public:
    nodeKdTree *right;
    nodeKdTree *left;
    int rNum;
    int lNum;
    int numInArr;
    photon pht;
    int key;//1 - x 2 - y 3 - z
    void CreateTree(photon *p, nodePhoton *newP, int num, int iStart, int rootIndex, int iBranch);
    void operator() (nodeKdTree node, photon *p, nodePhoton *newP, int num, int iStart, int rootIndex, int iBranch)
    {
        node.CreateTree(p, newP, num, iStart, rootIndex, iBranch);
    }
};
и мне нужно создать объект, и передать его в поток со всеми параметрами для operator():
C++
1
2
nodeKdTree a;
std::thread th1(a, this->left, lz, newP, lnum, iStart, newIndex, -1);
но что-то я не так делаю.
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
19.04.2014, 12:43     Многопоточность при сортировке массивов #57
Цитата Сообщение от NEvOl Посмотреть сообщение
nodeKdTree a;
std::thread th1(a, this->left, lz, newP, lnum, iStart, newIndex, -1);
Это где делается? this здесь откуда?

Добавлено через 1 минуту
Цитата Сообщение от NEvOl Посмотреть сообщение
но что-то я не так делаю.
Не компилируется?
NEvOl
19 / 18 / 0
Регистрация: 13.08.2012
Сообщений: 726
19.04.2014, 12:46  [ТС]     Многопоточность при сортировке массивов #58
Цитата Сообщение от alsav22 Посмотреть сообщение
Это где делается?
это делается внутри функции nodeKdTree::CreateTree()
у объекта nodeKdTree имеется объект left (nodeKdTree) для которого нужно вызвать функцию CreateTree().

Добавлено через 52 секунды
вот что говорит:
1 IntelliSense: no instance of constructor "std::thread::thread" matches the argument list
argument types are: (nodeKdTree (), nodeKdTree *, photon *, nodePhoton *, int, int, int, int) c:\filtering1\Filtering\kdTree.h 246
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
19.04.2014, 12:48     Многопоточность при сортировке массивов #59
И не нужно, в operator(), передавать nodeKdTree node, метод класса и так может вызвать другой метод класса.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.04.2014, 12:58     Многопоточность при сортировке массивов
Еще ссылки по теме:

Использование массива индексов при сортировке - C++
Задали задачку отсортировать обычный одномерный массив. Так же, нужно использовать массив индексов, чтобы показать, как отсортирован...

Количество перестановок при сортировке массива - C++
Как вывести число количества перестановок после сортировки массива, допустим выбору?

Выход за пределы массива при его сортировке - C++
#include "stdafx.h" #include <time.h> #include <clocale> #include <iostream> using namespace std; int _tmain(int argc, _TCHAR*...

ОБНУЛЯЕТСЯ ДРОБНАЯ ЧАСТЬ ПРИ СОРТИРОВКЕ МАССИВА!!! - C++
Массив B сформировать по правилу b = sqrt(fabsf(i * i - a)), где a=25.8. Найти сумму элементов с номерами с 5-го по 10-ый, упорядочить эти...

функция qsort при сортировке массива структур - C++
Заголовочный файл: #include <stdio.h> #include <ctype.h> #include <string.h> #include <stdlib.h> #include <conio.h> #define...


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

Или воспользуйтесь поиском по форуму:
NEvOl
19 / 18 / 0
Регистрация: 13.08.2012
Сообщений: 726
19.04.2014, 12:58  [ТС]     Многопоточность при сортировке массивов #60
alsav22, это я понимаю, суть функтора это объект который фыполняет какие-то действия ?
т.е. в моем случае он должен вызывать метод объекта, я могу написать так?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class functor
{
    functor()
    {
 
    }
    ~functor()
    {
 
    }
    void operator() (nodeKdTree node, photon *p, nodePhoton *newP, int num, int iStart, int rootIndex, int iBranch)
    {
        node.CreateTree(p, newP, num, iStart, rootIndex, iBranch);
    }
};
при этом объект класса functor это будет функтор, который можно передать в поток со всеми параметрами? например так:
C++
1
2
functor a
std::thread th1(a, this->left, lz, newP, lnum, iStart, newIndex, -1);
Yandex
Объявления
19.04.2014, 12:58     Многопоточность при сортировке массивов
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru