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

OpenMP, создание потоков - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 43, средняя оценка - 4.95
Union
 Аватар для Union
17 / 17 / 2
Регистрация: 16.08.2010
Сообщений: 252
30.08.2010, 19:23     OpenMP, создание потоков #1
В инете нашел много примеров по распараллеливание циклов, но никак не могу понять, как просто написать чтобы конкретная функция выполнялась в отдельном потоке?

C++
1
2
3
4
5
6
7
8
9
10
11
int main()
{
    #pragma omp parallel
           {
              start_log("gsd", 34, "link", "proj");
           }
    #pragma omp parallel
           {
              start_log("rfs", 35, "klik", "proj");
           }
}
Вот пример, нерабочий естесно.
Нужно чтобы функция void start_st каждый раз при вызове запускалась в отдельном потоке. Т.е. должно получится в данном случае 3 потока (1 - основной и 2 - функция start_st с разыми параметрами)
Подскажите как правильно написать?
Спасибо
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Andrew_Lvov
Эксперт C++
 Аватар для Andrew_Lvov
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 758
Записей в блоге: 1
30.08.2010, 20:06     OpenMP, создание потоков #2
Какой компилятор ? Дополнительные ключи компиляции используешь ?

Добавлено через 3 минуты
Вот пример кода, к-рый должен работать:

C++
1
2
3
4
5
6
#include <omp.h>
#include <stdio.h>
int main() {
#pragma omp parallel
    printf("Hello from thread %d, nthreads %d\n", omp_get_thread_num(), omp_get_num_threads());
}
Union
 Аватар для Union
17 / 17 / 2
Регистрация: 16.08.2010
Сообщений: 252
30.08.2010, 20:19  [ТС]     OpenMP, создание потоков #3
Пишу в VS2010.
А чем ваш вариант отличается от моего?
Мне нужно чтобы работало так:
- запустилась прога
- потом создался отдельны поток и в нем начала выполняться функция с первыми параметрами
- потом создался второй поток и в нем начала выполняться функция с вторыми параметрами
- основной поток, функция main начала выполняться дальше
Т.е. в результате 3 отдельных потока.

В вашем примере всего одна функция printf и по всей видимости выполняется 2 раза...
Покажите пожалуйста как сделать чтобы
printf("Hello 1")
выполнелось в одном отдельном от main потоке, а
printf("Hello 2")
во втором.
Andrew_Lvov
Эксперт C++
 Аватар для Andrew_Lvov
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 758
Записей в блоге: 1
30.08.2010, 20:23     OpenMP, создание потоков #4
Цитата Сообщение от Union Посмотреть сообщение
А чем ваш вариант отличается от моего?
Я привёл код, к-рый однозначно рабочий. Если у вас он не запускается, нужно скорее всего добавить ключи для компиляции.
Union
 Аватар для Union
17 / 17 / 2
Регистрация: 16.08.2010
Сообщений: 252
30.08.2010, 21:02  [ТС]     OpenMP, создание потоков #5
Andrew_Lvov работает, но не так, как мне нужно

Добавлено через 37 минут
Может можно как-то так реализовать:
Код
int a=0;
#pragma omp parallel
while (a++ != 10) {
 запустить и обработать printf( "%i",  a); в отдельном потоке
}
?
Andrew_Lvov
Эксперт C++
 Аватар для Andrew_Lvov
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 758
Записей в блоге: 1
30.08.2010, 21:04     OpenMP, создание потоков #6
Цитата Сообщение от Union Посмотреть сообщение
Может можно как-то так реализовать:
Предполагаю, для этого нужен #pragma omp parallel for
Union
 Аватар для Union
17 / 17 / 2
Регистрация: 16.08.2010
Сообщений: 252
31.08.2010, 18:02  [ТС]     OpenMP, создание потоков #7
Не компилируется:
Требуется цикл For, следующий за директивой OpenMP "parallel for"
я хочу реализовать без цикла for

Разобрался как запускать куски кода в отделных потоках без цикла, нужно заключать их в
#pragma omp section
осталось разобраться с циклом while, может кто подскажет? или OpenMP самое плохое решение многопоточности и никто никогда её не применял?
Andrew_Lvov
Эксперт C++
 Аватар для Andrew_Lvov
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 758
Записей в блоге: 1
31.08.2010, 18:18     OpenMP, создание потоков #8
А что, while на for нельзя заменить ?
Union
 Аватар для Union
17 / 17 / 2
Регистрация: 16.08.2010
Сообщений: 252
31.08.2010, 19:08  [ТС]     OpenMP, создание потоков #9
Можно, но зачем, если нет смысла? Во многих случая while удобнее и правильнее.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
31.08.2010, 19:10     OpenMP, создание потоков #10
Union, Идентичные циклы елки палки. На вкус и цвет. Где-то удобнее while, где-то for. Но они взаимно-заменяемые
Union
 Аватар для Union
17 / 17 / 2
Регистрация: 16.08.2010
Сообщений: 252
31.08.2010, 20:31  [ТС]     OpenMP, создание потоков #11
Допустим мне необходимо считывать строки из базы и на каждую запускать отдельный поток.
Через цикл while это будет так:
C++
1
2
3
4
while( ( row = mysql_fetch_row(result)) != NULL ) {
   printf("id: %s,  tp: %s:%s \n", row[0], row[1], row[2]); // Выводим содержимое строки
   start_thread(row[0], row[1], row[2]) // Запускаем в отдельном потоке функцию start_thread с параметрами из базы
}
Через цикл For это будет так:

C++
1
2
3
4
5
6
7
8
9
result = mysql_store_result(conn); // Получаем кол-во строк
#pragma omp parallel
{
#pragma omp for
for(int i = 1; i < result; ++i) // Тут мог намудрить, надо проверить, но смысл остаётся тот-же
   row = mysql_fetch_row(result));
   printf("id: %s,  tp: %s:%s \n", row[0], row[1], row[2]); // Выводим содержимое строки
   start_thread(row[0], row[1], row[2]) // Запускаем в отдельном потоке функцию start_thread с 
}
В общем тут гораздо больше всего ненужного...
В первом примере осталось только запустить функцию в отдельном потоке.
Во втором всё, что заключено в цикл for в каждом цикле будет создаваться новый поток и выполняться в нём, если я правильно понял... хотя на некоторых сайтах пишут что потоки динамически добавляться не могут и устанвливаются вначале столько, сколько ядер. Тогда если у меня рассчитано что функция исполняется неограниченное время - программа зависне, т.к. функция не будет запущена столько раз, сколько строк в базе.

Да, так и есть, с циклом for выходит фигня

Добавлено через 13 минуты
Я неправильно задал вопрос... как с помощью OpenMP указать что такую-то функцию нужно выполнить в отдельном потоке? В таком случае не важно какой цикл используется.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16821 / 5242 / 318
Регистрация: 30.03.2009
Сообщений: 14,118
Записей в блоге: 26
16.11.2014, 23:16     OpenMP, создание потоков #12
Цитата Сообщение от Union Посмотреть сообщение
Нужно чтобы функция void start_st каждый раз при вызове запускалась в отдельном потоке. Т.е. должно получится в данном случае 3 потока (1 - основной и 2 - функция start_st с разыми параметрами)
Подскажите как правильно написать?
Если я правильно понял постановку вопроса, то так:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <omp.h>
#include <stdio.h>
 
int main (void)
{
#pragma omp parallel sections
  {
 
#pragma omp section
    {
      printf ("section1, thread=%d\n", omp_get_thread_num());
      start_log ("gsd", 34, "link", "proj");
    }
 
#pragma omp section
    {
      printf ("section2, thread=%d\n", omp_get_thread_num());
      start_log ("rfs", 35, "klik", "proj");
    }
  }
 
  return 0;
}
Добавлено через 1 минуту
Но при этом внутри секций надо не забывать работать с синхронизацией. Так я в примере воткнул в обе паралkельные ветки вызов printf'а, который в общем случае может и не уметь правильно работать в потоках (т.е. печати от обоих printf'ов за счёт параллельного исполнения в консоли могут перемешаться)
Max Dark
16.11.2014, 23:22
  #13

Не по теме:

всего то 4 года прошло...

Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16821 / 5242 / 318
Регистрация: 30.03.2009
Сообщений: 14,118
Записей в блоге: 26
16.11.2014, 23:26     OpenMP, создание потоков #14
Цитата Сообщение от Cra3y Посмотреть сообщение
всего то 4 года прошло...
Едрить-растудыть, эк меня ж угораздило...

Добавлено через 36 секунд
В тему попал, ковыряясь в гугле, на дату чота не обратил внимания
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.11.2014, 23:33     OpenMP, создание потоков
Еще ссылки по теме:

OpenMP C++
C++ Создание потоков в рекурсивной функции
Создание потоков в openmp C++

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

Или воспользуйтесь поиском по форуму:
castaway
16.11.2014, 23:33     OpenMP, создание потоков
  #15

Не по теме:

Алкоголь он такой...

Yandex
Объявления
16.11.2014, 23:33     OpenMP, создание потоков
Ответ Создать тему
Опции темы

Текущее время: 01:37. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru