Название: Многопоточное вычисление функции Отправлено: qtest от Июнь 17, 2013, 23:08 Здравствуйте.
Есть работающий код, нормально выводящий результаты каждого потока по отдельности, как синхронизовать их для вывода в одну переменную в мейне? Пытался читать про мьютексы и семафоры - ничего понятного не нашел. Наиболее простой пример: Код: #include <QCoreApplication> Название: Re: Многопоточное вычисление функции Отправлено: Авварон от Июнь 18, 2013, 00:19 Во-первыйх, юзайте QtConcurrent. Во-вторых... ну, вобщем, разберетесь.
Название: Re: Многопоточное вычисление функции Отправлено: Igors от Июнь 18, 2013, 13:02 Здравствуйте. Может имелось ввиду "как накапливать сумму в main"? Если у Вас нитки запускаются один раз, то можно и без синхронизацииЕсть работающий код, нормально выводящий результаты каждого потока по отдельности, как синхронизовать их для вывода в одну переменную в мейне? Код
Название: Re: Многопоточное вычисление функции Отправлено: qtest от Июнь 19, 2013, 11:11 Во-первыйх, юзайте QtConcurrent. Во-вторых... ну, вобщем, разберетесь. Судя по описанию, он автоматически распараллеливает задачу на имеющееся количество ядер, это конечно даже эффективнее, но возможно ли самому указать количество потоков? Может имелось ввиду "как накапливать сумму в main"? Если у Вас нитки запускаются один раз, то можно и без синхронизации А если то же самое, но с накоплением суммы в глобальную переменную в самой f() и ее выводом в мейне? Т.е. цель - не столько решение конкретной задачи, сколько понимание мьютексов и семафоров.Название: Re: Многопоточное вычисление функции Отправлено: alex312 от Июнь 19, 2013, 11:28 , но возможно ли самому указать количество потоков? http://qt-project.org/doc/qt-5.0/qtcore/qthreadpool.html#globalInstanceНазвание: Re: Многопоточное вычисление функции Отправлено: Igors от Июнь 19, 2013, 11:49 А если то же самое, но с накоплением суммы в глобальную переменную в самой f() и ее выводом в мейне? Т.е. цель - не столько решение конкретной задачи, сколько понимание мьютексов и семафоров. Ну если "не выжимать скорость" то все очень простоКод: void run(){ Название: Re: Многопоточное вычисление функции Отправлено: m_ax от Июнь 19, 2013, 12:35 Я бы курил в сторону std::future + std::async
Название: Re: Многопоточное вычисление функции Отправлено: Авварон от Июнь 19, 2013, 13:48 Я бы курил в сторону std::future + std::async Тот же конкурент, только убогий. Название: Re: Многопоточное вычисление функции Отправлено: Igors от Июнь 19, 2013, 13:55 Тоже мне "курцы"
Код
Название: Re: Многопоточное вычисление функции Отправлено: Old от Июнь 19, 2013, 14:22 Тоже мне "курцы" Фи. По начитались букварей по OpenMP...Где взрослый суровый велосипед? ;) Название: Re: Многопоточное вычисление функции Отправлено: qtest от Июнь 19, 2013, 15:48 Код: #include <QCoreApplication> Код: QMutextLocker locker(&mutex); Код: mutex.lock(); Название: Re: Многопоточное вычисление функции Отправлено: Old от Июнь 19, 2013, 15:51 Не работает... Что значит не работает?Название: Re: Многопоточное вычисление функции Отправлено: Igors от Июнь 19, 2013, 16:52 Это правильно? Как можно сделать то же самое, но с помощью семафора, а не wait()? QThread::wait - просто ждем когда нитка отработает, к мутексу это отношения не имеетНе работает, он делает то же самое? Да, то же самое и работать должноХотите потренироваться - возьмите задачу. Напр на семафоры: - одна нитка читает символ (напр с клавы), другая нитка этот символ печатает Фи. По начитались букварей по OpenMP... Был, и даже вполне успешно боролся с реализацией gcc 4.4. Но против интеловской не устоял :)Где взрослый суровый велосипед? ;) Название: Re: Многопоточное вычисление функции Отправлено: qtest от Июнь 19, 2013, 18:18 Хотите потренироваться - возьмите задачу. Напр на семафоры: - одна нитка читает символ (напр с клавы), другая нитка этот символ печатает Код: #include <QCoreApplication> Что значит не работает? Код: Mutext Название: Re: Многопоточное вычисление функции Отправлено: Old от Июнь 19, 2013, 19:16 Все работает, только не совсем понятно что и как он делает. Оно делает тоже что и ваш код, только безопасно. Эта конструкция никогда не забудет освободить ресурс, что нельзя сказать о человеке. :)Название: Re: Многопоточное вычисление функции Отправлено: Igors от Июнь 19, 2013, 19:22 Так? Не так, если wthread первой захватит мутекс, она шлепнет char который еще не был введен. Не надо полагать что насовал мутексов побольше - и все дела.Да, и откуда такая любовь к самому себе? (HighPriority) :) Название: Re: Многопоточное вычисление функции Отправлено: qtest от Июнь 19, 2013, 20:35 Оно делает тоже что и ваш код, только безопасно. Эта конструкция никогда не забудет освободить ресурс, что нельзя сказать о человеке. :) Это понятно, но в случае лок и анлок видно, где что открывается и где закрывается, а тут - не совсем.Не так, если wthread первой захватит мутекс, она шлепнет char который еще не был введен. Не надо полагать что насовал мутексов побольше - и все дела. Если убрать откуда-либо мутекс, путчар вообще будет работать без остановки.Да, и откуда такая любовь к самому себе? (HighPriority) :) На всякий случай, может испортиться статистика какого-нибудь вывода. Это нежелательно? Название: Re: Многопоточное вычисление функции Отправлено: Igors от Июнь 20, 2013, 12:03 Если убрать откуда-либо мутекс, путчар вообще будет работать без остановки. Так вот и используйте семафоры для остановки/синхронизацииНа всякий случай, может испортиться статистика какого-нибудь вывода. Это нежелательно? Да, нежелательно. Разве Вы наверняка знаете что именно эта нитка будет иметь больше работы? Нет, так зачем говорить ОС чаще отдавать упраление нитке все равно ждущей на getchar? Делайте по смыслу а не "на всякий случай" Название: Re: Многопоточное вычисление функции Отправлено: qtest от Июнь 21, 2013, 04:01 Так вот и используйте семафоры для остановки/синхронизации Так вот в том и проблема, что семафоры я не понимаю, в самой первой программе тоже хотелось бы использовать их, а не вейт. Можете показать на этом примере как надо? Название: Re: Многопоточное вычисление функции Отправлено: Old от Июнь 21, 2013, 07:30 Так вот в том и проблема, что семафоры я не понимаю Что именно не понимаете: как они работают или как их нужно использовать?Напишите как вы понимаете их сейчас. Название: Re: Многопоточное вычисление функции Отправлено: Igors от Июнь 21, 2013, 08:18 Так вот в том и проблема, что семафоры я не понимаю, в самой первой программе тоже хотелось бы использовать их, а не вейт. Можете показать на этом примере как надо? Что-то Вы слишком пассивныКод Нитка ждет на закрытом cемафоре. Когда др нитка сделает theSemaphore.release() cемафор откроется, сработает putchar и затем снова ожидание. Дальше сами |