crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> Логика работы многопоточности
RazrFalcon
  опции профиля:
сообщение 7.12.2010, 14:23
Сообщение #1


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


Пример:
Раскрывающийся текст
#include <QtCore/QCoreApplication>
#include <QtDebug>
#include <QThread>

class MyThread : public QThread
{
public:
     void run();
};

class MyThread2 : public QThread
{
public:
     void run();
};

int match(переменные)
{
    for (int j=0; j<10; j++)
    {

    }
    return n;
}

int main()
{
    MyThread th;
    MyThread2 th2;
    th.start();
    th2.start();
    for (int i=0; i<10; i+=2)
    {
        //тут я должен передать i=0 в один поток, а i=1 во второй.
        и получить обратно
    }
    return 0;
}

void MyThread::run()
{
    match(переменные);
}

void MyThread2::run()
{
    match(переменные);
}


Одним словом у меня есть цикл в котором я должен передавать разные значение в потоки и получать обратно результат обработки функции match.
Лучше описать не могу, так как не совсем понимаю как должна выглядеть программа такая.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Sokoloff
  опции профиля:
сообщение 7.12.2010, 15:28
Сообщение #2


Участник
**

Группа: Участник
Сообщений: 237
Регистрация: 1.4.2009
Из: Москва
Пользователь №: 654

Спасибо сказали: 50 раз(а)




Репутация:   11  


Цитата(RazrFalcon @ 7.12.2010, 14:23) *
Пример:
Одним словом у меня есть цикл в котором я должен передавать разные значение в потоки и получать обратно результат обработки функции match.
Лучше описать не могу, так как не совсем понимаю как должна выглядеть программа такая.


Из твоего объяснения ничего не понятно. Почитай это может подойдет.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 7.12.2010, 15:34
Сообщение #3


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


Цитата(RazrFalcon @ 7.12.2010, 16:23) *
Лучше описать не могу, так как не совсем понимаю как должна выглядеть программа такая.

а в чём, собственно, проблема-то? у тебя какая-то сентенция по поводу того, что ты не знаешь, вышла.
ты пробовал для начала выписать условия задачи, с формализацией?
в конце концов, представь, что это не задачи, а картошка и есть два человека, которые её должны почистить. вроде никакой особой алгоритмической сложности в такой задаче нет :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 7.12.2010, 15:55
Сообщение #4


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


В этом и проблема, я не могу понять логику работы.
Проблема в том, что мне нужно передать значения в функцию которая в потоке находится.
И еще, если у меня потоки создаются изначально, то там что должны бить просто while постоянно?
У меня есть цикл основной, в нем циклично посылаться должны значения двум потокам.

Пример:
Есть 20 изображений, 10 изначальных и 10 измененных. У меня есть цикл который сравнивает эти изображения. То есть берем 1-е изначальное и сравниваем с 10 измененными, и находим нужное. Потом второе исходное снова с 10 сравниваем и тд.
Я хочу распараллелить (так как долго обрабатываются изображения), к примеру четные исходные первый поток обрабатывает, а нечетные второй. Ну или первые 5-ть - первый, остальные пять - второй.

Сообщение отредактировал RazrFalcon - 7.12.2010, 15:56
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 7.12.2010, 22:13
Сообщение #5


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


RazrFalcon, если сравнений нужно производить больше, чем у тебя ядер процессора, то распараллеливать тут нечего - будет только медленнее. Сравнивай в одном отдельном потоке по очереди

то ли дело, если бы было 4 ядра и одно сравнение: 1 ядро - главный поток, 3 потока в 3 ядрах: каждый свою треть картинки шмонает. Вот тогда выгода в скорости налицо :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 7.12.2010, 22:43
Сообщение #6


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


Ну так, у меня 2-а ядра. Каждое свою половину сравнивает. Как тут производительность ухудшится?
PS жду ваше 1000-е сообщение :lol:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 8.12.2010, 19:38
Сообщение #7


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


:p :D

Цитата
к примеру четные исходные первый поток обрабатывает, а нечетные второй

где тут про половину изображдения то ? )) Нету про половину. Говоришь про целые картинки же
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 8.12.2010, 19:54
Сообщение #8


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


Я имел в виду половину изображениЙ (пол. количества общего)
Ну а логику в принципе понял.
То есть если у меня 2-а ядра, а создаю 3-и потока, 1-й основной, который посылает 2-м обрабатывающим задания, то это только ухудшит производительность.

Я так понимаю лучше всего это один(главный) управляющий и второй обрабатывающий?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 8.12.2010, 20:18
Сообщение #9


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


ну, если во время вычислений основной поток ленится, то, для красоты/удобства, вполне можно запустить два одинаковых бурных потока. Главное, чтобы они делали воистину распараллеливание, а не последовательное решение задачи, с которой и один поток бы справился, да ещё и побыстрее бы это сделал :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 8.12.2010, 20:19
Сообщение #10


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(RazrFalcon @ 8.12.2010, 21:54) *
1-й основной, который посылает 2-м обрабатывающим задания, то это только ухудшит производительность.
и эти два вторичных буду по очереди работать + затраты на их переключение
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 22.12.2024, 12:55