|
Модераторы: xvr |
|
denisminb |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 9.6.2012 Репутация: нет Всего: нет |
Добрый день,подскажите пожалуйста в вопросе многопоточности, читаю книги, смотрю разные реализации, в общем начал практиковаться,не совсем получается мне кажется.
Для примера,может конечно не совсем удачно, взял вычисление числа PI c определенной точностью. без использования потоков, было нечто такое: описан прототип фукнции сама функция в мейне вызов функции, вывод результата итд использую
для того чтобы работало с потоками добавил в функцию void*
примерно так так вот, прога компилится, вроде как поток создается,но результат вычисления функции не отображается,не могу понять,что ещё нужно сделать хочу получить в итоге, распараллеливание вычислений, с использованием нескольких потоков итд |
||||||
|
|||||||
Фантом |
|
|||
Вы это прекратите! Профиль Группа: Участник Клуба Сообщений: 1516 Регистрация: 23.3.2008 Репутация: 1 Всего: 49 |
Пока что в этом коде результат вычисления функции отображать просто нечему (то, что закомментировано, не в счет).
|
|||
|
||||
denisminb |
|
||||
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 9.6.2012 Репутация: нет Всего: нет |
сама функция |
||||
|
|||||
Фантом |
|
|||
Вы это прекратите! Профиль Группа: Участник Клуба Сообщений: 1516 Регистрация: 23.3.2008 Репутация: 1 Всего: 49 |
Она у Вас просто зацикливается, причем потоки тут совершенно не при чем.
P.S. Кстати, Вы действительно хотите делать ввод параметров в каждом потоке? |
|||
|
||||
denisminb |
|
|||
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 9.6.2012 Репутация: нет Всего: нет |
while (Ryad > Esp) - ну да, здесь зацикливание, скорей всего нет, правильней будет один раз ввести данные,правильно же? |
|||
|
||||
Фантом |
|
|||
Вы это прекратите! Профиль Группа: Участник Клуба Сообщений: 1516 Регистрация: 23.3.2008 Репутация: 1 Всего: 49 |
||||
|
||||
denisminb |
|
|||
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 9.6.2012 Репутация: нет Всего: нет |
самое интересное,то что функция возвращала правильное значение Pi, без использования потоков |
|||
|
||||
denisminb |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 9.6.2012 Репутация: нет Всего: нет |
можно ещё вопрос? как думаете лучше вообще переписать алгоритм без использования While? или например от того чтобы не зацикливало,добавил
|
||||||
|
|||||||
Фантом |
|
|||
Вы это прекратите! Профиль Группа: Участник Клуба Сообщений: 1516 Регистрация: 23.3.2008 Репутация: 1 Всего: 49 |
||||
|
||||
rsm |
|
||||
Опытный Профиль Группа: Участник Клуба Сообщений: 999 Регистрация: 16.3.2005 Репутация: 3 Всего: 62 |
Для сугубо численных вычислений лучше использовать OpenMP.
Цикл нужен так или иначе, просто каждому потоку нужно выделить определённый интервал вычислений количества знаков после запятой, как-то так: [0, 10000) - первый поток; [10000, 20000) - второй; [20000, 30000) - третий; [20000, 40000) - четвёртый; и т.д. в том же духе. Оптимальное количество потоков обычно принимают равным количеству ядер процессора * 2 + 1. |
||||
|
|||||
denisminb |
|
|||
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 9.6.2012 Репутация: нет Всего: нет |
||||
|
||||
denisminb |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 9.6.2012 Репутация: нет Всего: нет |
в принципе в теории я понимаю что для того чтобы программа была многопоточная,вычисляла параллельно,нужно распараллелить алгоритм,разбить на блоки. только не пойму как в моём варианте сделать? На данном этапе, в цикле вычисляю очередной член ряда и затем суммирую,выхожу из цикла по количеству итераций. Вы пишите, что нужно разбить на интервалы,этот контекст не совсем понимаю. я думал если разбить по количеству итераций, но как собрать результаты потоков?тогда нужно для каждого интервала писать свою функцию вызова для pthread_create? P.S. Нужно сделать без OpenMP, точнее даже нужно два варианта без него и с ним. Но пока его не нужно. |
||||||
|
|||||||
rsm |
|
|||
Опытный Профиль Группа: Участник Клуба Сообщений: 999 Регистрация: 16.3.2005 Репутация: 3 Всего: 62 |
||||
|
||||
denisminb |
|
||||
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 9.6.2012 Репутация: нет Всего: нет |
спасибо за статью,ознакомлюсь, сделал так, с блокировками
Добавлено через 6 минут и 21 секунду ага,только не совсем понимаю,как запустить в qnx версию с openMP, как хидер подключить? Это сообщение отредактировал(а) denisminb - 15.5.2013, 20:27 |
||||
|
|||||
Фантом |
|
|||
Вы это прекратите! Профиль Группа: Участник Клуба Сообщений: 1516 Регистрация: 23.3.2008 Репутация: 1 Всего: 49 |
Задача слишком "ненастоящая", чтобы можно было просто так выбирать что-то лучшее. Например, с математической точки зрения лучше воспользоваться оценкой остатка для ряда и, зная необходимую точность, заранее вычислить необходимое число членов (и тогда цикл while, понятно, не нужен). |
|||
|
||||
Правила форума "С/С++: Программирование под Unix/Linux" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |