Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.56/34: Рейтинг темы: голосов - 34, средняя оценка - 4.56
20 / 19 / 1
Регистрация: 13.08.2012
Сообщений: 779

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

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

Студворк — интернет-сервис помощи студентам
Уважаемые, столкнулся с ситуацией, имею 3 массива, содержимое которых одинаково (координаты точек в 3д пространстве), произвожу сортировку каждого массива по определенному измерению (x, y, z), хотел спросить, можно ли как-то ускорить процесс, возникла идея многопоточности (т.е. одновременно выполнять сортировку 3-х массивов), но я не уверен что я корректно мыслю т.к. не разу не сталкивался с многопоточностью, подскажите как правильно ?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
13.04.2014, 22:11
Ответы с готовыми решениями:

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

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

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

84
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
19.04.2014, 13:08
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от NEvOl Посмотреть сообщение
это делается внутри функции nodeKdTree::CreateTree()
у объекта nodeKdTree имеется объект left (nodeKdTree) для которого нужно вызвать функцию CreateTree().
У вас что там, рекурсия?
0
20 / 19 / 1
Регистрация: 13.08.2012
Сообщений: 779
19.04.2014, 13:10  [ТС]
Цитата Сообщение от alsav22 Посмотреть сообщение
У вас что там, рекурсия?
да, рекурсия.
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
19.04.2014, 13:13
Цитата Сообщение от newbie666 Посмотреть сообщение
да конечно лучше делать в трёх потоках, для такой примитивной цели можешь не гемороиться с ручным созданием потоков, советую использовать Intel TBB и его parallel_for и на будущее, поставь себе Intel Parallel Studio - много чего узнаешь вдобавок .
Как раз лучше не гемориться с parallel_for, Intel TBB и тому подобным. Ладно ещё стояла бы задача автоматически выбрать количество потоков в вычислении среднего массива, тогда да. А так проще всего по числу массивов запустить "вручную" нужное количество потоков и не мучаться.
0
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
19.04.2014, 13:18
Что касается:
Цитата Сообщение от NEvOl Посмотреть сообщение
метода класса ? что бы указать для потоку ее в качестве функции потока.
я объяснил, а с остальным (рекурсия и прочие конструкции) сами разбирайтесь.

Добавлено через 3 минуты
C++
1
2
3
4
void operator() (nodeKdTree node, photon *p, nodePhoton *newP, int num, int iStart, int rootIndex, int iBranch)
{
        node.CreateTree(p, newP, num, iStart, rootIndex, iBranch);
}
Первый параметр не указатель, а передать пытаетесь указатель (left):
C++
1
std::thread th1(a, this->left, lz, newP, lnum, iStart, newIndex, -1);
Откуда и:
Цитата Сообщение от NEvOl Посмотреть сообщение
вот что говорит:
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
0
20 / 19 / 1
Регистрация: 13.08.2012
Сообщений: 779
19.04.2014, 13:21  [ТС]
в любом случае пока ругается на первый параметр "а".
C++
1
2
    1   IntelliSense: no instance of constructor "std::thread::thread" matches the argument list
            argument types are: (functor (), nodeKdTree *, photon *, nodePhoton *, int, int, int, int)  c:\filtering1\Filtering\kdTree.h    247
0
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
19.04.2014, 13:30
Цитата Сообщение от NEvOl Посмотреть сообщение
в любом случае пока ругается на первый параметр "а".
В любом случае, тип параметров operator() не соответствует типам параметров, которые передаёте. Или не видите?
Цитата Сообщение от alsav22 Посмотреть сообщение
this->left,
Цитата Сообщение от alsav22 Посмотреть сообщение
nodeKdTree node
0
20 / 19 / 1
Регистрация: 13.08.2012
Сообщений: 779
19.04.2014, 13:38  [ТС]
переделал так:
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);
    }
};
и осуществляю вызов:
C++
1
2
functor a();
std::thread th1(a, this->left, lz, newP, lnum, iStart, newIndex, -1);
не понимаю почему тогда так не совпадают параметры, this->left возвращает ведь указатель на nodeKdTree ?
error:
1 IntelliSense: no instance of constructor "std::thread::thread" matches the argument list
argument types are: (functor (), nodeKdTree *, photon *, nodePhoton *, int, int, int, int) c:\filtering1\Filtering\kdTree.h 243
0
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
19.04.2014, 14:03
Цитата Сообщение от NEvOl Посмотреть сообщение
functor a();
C++
1
functor a;
И другие параметры, на соответствие типов, проверьте.
0
20 / 19 / 1
Регистрация: 13.08.2012
Сообщений: 779
19.04.2014, 16:31  [ТС]
добился что бы работало так:
C++
1
2
functor a;
a(this->left, lx, newP, lnum, iStart, newIndex, -1, thr);
теперь нужно только это все в поток закинуть, в качестве поточной функции мы указывает объект класс ?

Добавлено через 14 минут
класс теперь такой:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class functor
{
public:
    functor()
    {
 
    }
    ~functor()
    {
 
    }
    void operator() (nodeKdTree *node, photon *p, nodePhoton *newP, int num, int iStart, int rootIndex, int iBranch, bool thr)
    {
        node->CreateTree(p, newP, num, iStart, rootIndex, iBranch, thr);
    }
};
Добавлено через 18 минут
я просто не знаю как правильно передать функтор потоку, пытался сделать так:
C++
1
2
functor a;
std::thread th1(a, this->left, lx, newP, lnum, iStart, newIndex, -1, thr);
говорит: 36 IntelliSense: no instance of constructor "std::thread::thread" matches the argument list
argument types are: (functor, nodeKdTree *, photon *, nodePhoton *, int, int, int, int, bool) c:\thread\ConsoleApplication1\kdTree.h 155
0
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
19.04.2014, 21:25
Вот это что?
Цитата Сообщение от NEvOl Посмотреть сообщение
a(this->left, lx, newP, lnum, iStart, newIndex, -1, thr);
Цитата Сообщение от NEvOl Посмотреть сообщение
я просто не знаю как правильно передать функтор потоку, пытался сделать так:
C++
1
std::thread th1(a, this->left, lx, newP, lnum, iStart, newIndex, -1, thr);
Внешне всё правильно. Вот это сделали?
Цитата Сообщение от alsav22 Посмотреть сообщение
И другие параметры, на соответствие типов, проверьте.
Имеется ввиду, кроме первых двух, типы которых я вижу.

Добавлено через 7 минут
Вот код, по аналогии с вашим, который компилируется:
C++
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
#include <iostream>
#include <windows.h>
#include <thread>
using namespace std;
 
class A
{
    int a;
    A* pA;
public:
 
    A() : a(0), pA(NULL) {}
    A(int n) : a(n) {}
    
    void show()
    {
        cout << a << endl;
    }
    
    void operator()(A* p, int a, int b)
    {
        for (int i = a; i < b; ++i)
        {
           show();
        }
    }
    
    void f()
    {
        A obj;
 
        thread thr1(obj, this ->pA, 1, 5);
    }
};
 
int main()
{
 
    return 0;
}
1
20 / 19 / 1
Регистрация: 13.08.2012
Сообщений: 779
19.04.2014, 23:15  [ТС]
Цитата Сообщение от alsav22 Посмотреть сообщение
Вот это что?
Сообщение от NEvOl
a(this->left, lx, newP, lnum, iStart, newIndex, -1, thr);
это я показываю что без потоков работает) т.е. получается что типы соответствуют, а вот если кидаю в поток то ругается, ваш код работает) пытаюсь разобраться в чем у меня проблема, спасибо большое за помощь.

Добавлено через 1 час 0 минут
возможно что есть ограничения на число аргументов ?
потому что такой код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class A
{
    int a;
    A* pA;
public:
 
    A() : a(0), pA(NULL) {}
    A(int n) : a(n) {}
    
    void show(int a, int b, int c, int d)
    {
        cout << a << endl;
 
         A obj;
 
        thread thr1(obj, this->pA, a, b, c, d);
    }
    
    void operator()(A* p, int a, int b, int c, int d)
    {
           p->show(a, b, c, d);
    }
    
};
работает
а такой ошибку вызывает такую же как и у меня:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class A
{
    int a;
    A* pA;
public:
 
    A() : a(0), pA(NULL) {}
    A(int n) : a(n) {}
    
    void show(int a, int b, int c, int d, int e)
    {
        cout << a << endl;
 
         A obj;
 
        thread thr1(obj, this->pA, a, b, c, d, e);
    }
    
    void operator()(A* p, int a, int b, int c, int d, int e)
    {
           p->show(a, b, c, d, e);
    }
    
};
0
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
20.04.2014, 01:16
Цитата Сообщение от NEvOl Посмотреть сообщение
возможно что есть ограничения на число аргументов ?
Всё компилируется:
C++
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
#include <iostream>
#include <thread>
using namespace std;
 
 
class A
{
    int a;
    A* pA;
 
public:
    A() : a(0), pA(NULL) {}
    A(int n) : a(n) {}
 
    void show()
    {
        cout << a << endl;
    }
 
    void operator()(A* p, int a, int b, int c, int d, int f, int g, int w, int q)
    {
        p ->f(a, b, c, d, f, g, w, q);
    }
 
    void f(int a, int b, int c, int d, int f, int g, int w, int q)
    {
        A obj;
 
        thread thr1(obj, this ->pA, a, b, c, d, f, g, w, q);
    }
};
 
 
int main()
{
    A a;
    a.f(1, 2, 3, 4, 5, 6, 7, 8);
 
    return 0;
}
Добавлено через 8 минут
И этот код (ваш, из 71 поста) компилируется (у меня) без ошибки:
C++
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 <iostream>
#include <thread>
using namespace std;
 
class A
{
    int a;
    A* pA;
public:
 
    A() : a(0), pA(NULL) {}
    A(int n) : a(n) {}
 
    void show(int a, int b, int c, int d, int e)
    {
        cout << a << endl;
 
         A obj;
 
        thread thr1(obj, this->pA, a, b, c, d, e);
    }
 
    void operator()(A* p, int a, int b, int c, int d, int e)
    {
           p->show(a, b, c, d, e);
    }
 
};
 
 
int main()
{
    A a;
    a.show(1, 2, 3, 4, 5);
 
    return 0;
}
Добавлено через 1 час 5 минут
Так можно метод класса передать в поток:
C++
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
#include <iostream>
#include <thread>
using namespace std;
 
class A
{
    int a;
 
public:
    A* pA;
    A() : a(0), pA(NULL) {}
    A(int n) : a(n) {}
 
    void show(A* pA, int a, int b, int c, int d, int e)
    {
         thread thr1(&A::show, pA, pA, a, b, c, d, e); // второй параметр - указатель на объект класса, дальше - параметры метода
 
    }
};
 
 
int main()
{
    A a;
    a.show(a.pA, 1, 2, 3, 4, 5);
 
    return 0;
}
Добавлено через 2 минуты
Энтони Уильямс "Параллельное программирование на С++ в действии. 2012."
1
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
20.04.2014, 01:21
NEvOl, alsav22, я объясню в чем проблема. Дело в том, что фича Variadic templates, которая используется в std::thread для реализации этой возможности, не поддерживается VS2010, собственно в VS2012 ее тоже нет. В этом можно убедиться, например, здесь. Поэтому std::thread там реализован "по-старинке", добавлением нескольких перегрузок с разным количеством параметров. Естественно при таком подходе присутствует ограничение на максимальное количество аргументов.
Так что, либо нужно использовать один из компиляторов mingw (4.8 и выше) или clang (3.3 и выше), в которых есть полная поддержка стандарта С++11, либо поставить VS2013, в которой есть поддержка variadic templates.
2
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
20.04.2014, 01:30
Я начал подозревать, что дело может в разных, с ТС, компиляторах, поэтому, в последнем посте, подчеркнул, что, именно у меня, компилируется (mingw 4.8.1).
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
20.04.2014, 01:32
alsav22, ну да. Совет использовать наиболее новые версии компиляторов относился к ТС. Это разумно, если хочется работать с новым стандартом с наименьшими проблемами.
0
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
20.04.2014, 02:08
NEvOl, в 13-ой студии компилируется.
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
20.04.2014, 02:40
Можно также использовать std::bind для формирования функтора.
0
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
20.04.2014, 02:54
DrOffset, не поймите превратно, но я просто проверил. Что меня смутило, в вашем сообщении, так вот это:
Цитата Сообщение от DrOffset Посмотреть сообщение
Дело в том, что фича Variadic templates, которая используется в std::thread для реализации этой возможности, не поддерживается VS2010, собственно в VS2012 ее тоже нет. ... Поэтому std::thread там реализован "по-старинке", добавлением нескольких перегрузок с разным количеством параметров.
Из этого можно предположить, что std::thread поддерживается в 10-й студии. Но разве это так?
0
20 / 19 / 1
Регистрация: 13.08.2012
Сообщений: 779
20.04.2014, 09:30  [ТС]
alsav22, а можно эту задачу реализовать через std::async ?
0
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
20.04.2014, 09:36
Цитата Сообщение от NEvOl Посмотреть сообщение
эту задачу
Эту - какую?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.04.2014, 09:36
Помогаю со студенческими работами здесь

Обработка массивов и многопоточность
Здравствуйте. Одна из функций обрабатывает массивы и постоянно изменяет переменные, записанные в хедере. Переменные изменяются другими...

Многопоточность: вывести на экран символ, который встречается наибольшее количество раз в каждом из массивов
У меня есть такая задачка: Есть 3 массивы 1 содержит 2 миллиона символов 2 содержит 1000000 символов 3 содержит 3 миллиона...

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

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

Ошибка при сортировке пузырьком
Видимо выход за предел массива, не пойму где ошибка #include &lt;iostream&gt; #include &lt;ctime&gt; #include &lt;cstdlib&gt; using...


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

Или воспользуйтесь поиском по форуму:
80
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru