powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / вычисление числа пи с использованием потоков
22 сообщений из 22, страница 1 из 1
вычисление числа пи с использованием потоков
    #38248358
denis_stell
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый вечер,подскажите пожалуйста, начал изучать изучение многопоточности микроядерных ОС семейства unix
Для понимания хочу вычислить число пи
такой код:
Код: plaintext
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.
41.
42.
43.
44.
45.
46.
47.
#include <stdio.h>
#include <pthread.h>

#define INTERVALS 100000
#define THREADS 4

float global_sum = 0.0;
pthread_mutex_t global_lock = PTHREAD_MUTEX_INITIALIZER;

void *pi_calc(void *num)
{
  float my_sum = 0.0;
  int myid = *(int*)num;
  float h = 1.0 / INTERVALS;
  int start = (INTERVALS / THREADS) * myid;
  int end = start + (INTERVALS / THREADS);

  float x;
  int i;
  for (i = start; i < end; i++)
  {
    x = h * ((float)i - 0.5);
    my_sum += x;
  }

  pthread_mutex_lock(&global_lock);
  global_sum += my_sum;
  pthread_mutex_unlock(&global_lock);
}

int main ()
{
  pthread_t tid[THREADS];
  int i;
  int t_num[THREADS];

  for (i = 0; i < THREADS;i++)
  {
    t_num[i] = i;
    pthread_create(&tid[i], NULL, pi_calc, &t_num[i]);
  }

  for (i = 0; i < THREADS; i++)
    pthread_join (tid[i], NULL);

  printf ("Sum = %f\n", global_sum);
}



в результате на консоле Sum = 49999.000000 не пойму почему?
...
Рейтинг: 0 / 0
вычисление числа пи с использованием потоков
    #38248440
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denis_stell,

Что-то я сильно сомневаюсь, что просуммировав индексы в цикле можно получить число, имеющее хоть какое-то отношение к Пи
...
Рейтинг: 0 / 0
вычисление числа пи с использованием потоков
    #38252288
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denis_stell, твой вопрос состоит из 2-х частей. Собственно мультипоточности. И формулы расчёта числа Пи.
По первому пункту всё просто. А второе - непонятно. Что за формулу ты использовал? Откуда?
...
Рейтинг: 0 / 0
вычисление числа пи с использованием потоков
    #38254439
denis_stell
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton,

да,согласен,это помутнение,извините.
а что Вы имеете в виду, под словом всё просто?
...
Рейтинг: 0 / 0
вычисление числа пи с использованием потоков
    #38254496
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Просто в том плане что туториал под unix с использованием потоков найти не сложно.

Сложно будет обосновать что нужно его применить для расчёта числа Пи. Тоесть говоря
простыми словами это надуманная или высосанная из пальца постановка. А такие
постановки - всегда спорны.
...
Рейтинг: 0 / 0
вычисление числа пи с использованием потоков
    #38254499
denis_stell
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton,

Можете подсказать?



создаю поток, следующим образом
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
#include <pthread.h>

int main (){
 ......
 ......
 pthread_t	our_thread_id;
 pthread_create(&our_thread_id,NULL,pi_calc,NULL); //Создаю поток


при компиляции выдает
Description Resource Path Location Type
initializing argument 3 of 'int pthread_create(pthread_t*, const pthread_attr_t*, void* (*)(void*), void*)' threads.cc /threads line 50 C/C++ Problem

pi_calc -фунция подсчета числа, проверил даже на примере из справки,не рабтает,
т.е.
Код: plaintext
1.
2.
//прототип
void *pi_calc();




Код: plaintext
1.
2.
3.
4.
5.
6.
7.
7void *pi_calc()
{
	           printf("functionA active\n");
		sleep(5);
		printf ("functionA is finished.\n");
		return(NULL);
}



Компилируется в среде QNX
...
Рейтинг: 0 / 0
вычисление числа пи с использованием потоков
    #38254508
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denis_stell//прототип
Код: sql
1.
void* pi_calc();


Код: sql
1.
void* (*)(void*)


Найди отличие.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
вычисление числа пи с использованием потоков
    #38254524
denis_stell
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

ага,спасибо,разобрался - заработало.
...
Рейтинг: 0 / 0
вычисление числа пи с использованием потоков
    #38255679
denis_stell
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ребят,чтобы не плодить тем, можно вопрос?
хочу добиться многопоточности,скажу сразу,пока новичек.
хотя бы получить в общем виде результат,
что на данный момент сделано?
1) Есть прототип функции
2)сама функция
Код: plaintext
1.
void *pi_calc(void*arg)

Без использования потоков функция возвращает результат вычисления
3)в main
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
           int id, result;
	pthread_t	our_thread_id;
	id = 1;
           result = pthread_create(&our_thread_id,NULL,&pi_calc,&id);
    	if (result != 0) {
         perror("Creating the first thread");
         return EXIT_FAILURE;
       }
..............
..............
          pthread_join(our_thread_id, NULL);
          pause();



так вот,может уже на данном этапе проблема,если в принципе всё так,то не пойму следующее:
компилится всё ок,поток создается, но результат функции потока я не вижу,может я суть потерял?
т.е. если грубо, то нужно чтобы вычисление вычислялось многопоточно,распараллеливание вычислений
...
Рейтинг: 0 / 0
вычисление числа пи с использованием потоков
    #38255731
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denis_stellнужно чтобы вычисление вычислялось многопоточно,распараллеливание
вычислений
Для этого нужно чтобы алгоритм был распараллеливаемый. Потом его надо собственно
распараллелить, т.е. разделить на части, каждая из которых может вычисляться независимо.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
вычисление числа пи с использованием потоков
    #38255770
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denis_stellкомпилится всё ок,поток создается, но результат функции потока я не вижу,может я суть потерял?


ГДЕ ты хочешь увидеть результат функции?
Тем более, что ты вызываешь

Код: plaintext
1.
pthread_join(our_thread_id, NULL);
...
Рейтинг: 0 / 0
вычисление числа пи с использованием потоков
    #38263803
denis_stell
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZiv,
Anatoly Moskovsky,
mayton,
Dimitry Sibiryakov,
Ребят,хочу всё таки разобраться с потоками,прочитал статьи на хабре вроде этой
написал это в qnx momentics 6.5
Код: plaintext
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.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
#include <iostream>
#include <iomanip>
#include <stdio.h>
#include <stdlib.h>
#include <sys/neutrino.h>
#include <pthread.h>
#include <errno.h>
#include <sched.h>
#include <unistd.h>
#include <math.h>

#define INTERVALS 100000
#define THREADS 2


using namespace std;

double global_sum = 0.0;
pthread_mutex_t global_lock = PTHREAD_MUTEX_INITIALIZER;

void *pi_calc(void *);

int main ()
{
  pthread_t tid[THREADS];
  int i,result;
  int t_num[THREADS];

  for (i = 0; i < THREADS; i++)
  {
    t_num[i] = i;
    result = pthread_create(&tid[i], NULL, pi_calc, &t_num[i]);
    if (result != 0) {
     perror("Creating the thread");
     return EXIT_FAILURE;
    }
  }

  for (i = 0; i < THREADS; i++){
      result = pthread_join (tid[i], NULL);
      if (result != 0) {
                perror("Joining the first thread");
                return EXIT_FAILURE;
              }
  }
  cout<<"Результат : "<<setprecision(20)<< global_sum<< endl;
}

void *pi_calc(void *)
{
  double my_pi = 0.0;
  double h = 1.0 / INTERVALS;
  double x;
  int i;
  for (i = 1; i < INTERVALS; i++)
  {
    x = ((double)i - 0.5)*h;
    my_pi = my_pi+ 4.0 / (1.0 + x * x);
  }

  pthread_mutex_lock(&global_lock);
  global_sum = my_pi*h;
  pthread_mutex_unlock(&global_lock);
}



чисто визуально всё ок.
в консоле всё выводится, но не могу объективно понять, правильно ли я работаю с потоками?чисто теоретически,да и практически
целевая система поднята на виртуалке,1 процессор.
...
Рейтинг: 0 / 0
вычисление числа пи с использованием потоков
    #38263805
denis_stell
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
вычисление числа пи с использованием потоков
    #38263808
denis_stell
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
реализацию с помощью openMP не смог сделать,точнее не смог подключить хидер omp.h
в теории,если конечно верно, нужно в целевой собрать omp.h должно заработать, но не хватает знаний как это сделать.
если есть мысли или полезные статьи, буду благодарен.
...
Рейтинг: 0 / 0
вычисление числа пи с использованием потоков
    #38263824
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denis_stell,

Начнем с того, что вы запускаете несколько потоков, но они не анализируют переданный параметр и делают одно и то же, и в конце по очереди перезаписывают результаты друг друга в глобальной переменной. А так как результаты одинаковые, то вам кажется что "чисто визуально всё ок"
...
Рейтинг: 0 / 0
вычисление числа пи с использованием потоков
    #38263872
denis_stell
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly Moskovsky,

не совсем понимаю,можете показать на моей программе или объяснить?
...
Рейтинг: 0 / 0
вычисление числа пи с использованием потоков
    #38263903
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denis_stell,

А что тут объяснять.

Вот вы N раз создаете потоки, передавая в них t_num[i]:
Код: plaintext
1.
result = pthread_create(&tid[i], NULL, pi_calc, &t_num[i]);


А ваши потоки игнорируют переданный параметр и каждый из них вычисляет некое значение не зависящее от внешних параметров, т.е. они делают одно и то же.
Код: plaintext
1.
2.
3.
4.
5.
void *pi_calc(void *)
{
...
 global_sum = ...; 
}


Посмотрите в ваше первое сообщение - там потоки рассчитывают разные значения исходя из параметра. Вам только нужно правильный алгоритм рассчета пи применить (какой правильный я не знаю, но не тот что там есть).

К сожалению, подробнее уже объяснять некуда.
...
Рейтинг: 0 / 0
вычисление числа пи с использованием потоков
    #38264007
landy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну если под qnx - вы бы лучше на qnx.org.ru поспрашивали
Там есть некоторая специфика
...
Рейтинг: 0 / 0
вычисление числа пи с использованием потоков
    #38264012
landy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да и вот

Вычисление N-го знака числа Пи без вычисления предыдущих
http://habrahabr.ru/post/179829/
...
Рейтинг: 0 / 0
вычисление числа пи с использованием потоков
    #38264039
landy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лучше сразу заходить
http://qnx.org.ru/forum
...
Рейтинг: 0 / 0
вычисление числа пи с использованием потоков
    #38264229
denis_stell
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly Moskovsky,
спасибо, доберусь до домашнего компа, буду пробовать.
...
Рейтинг: 0 / 0
вычисление числа пи с использованием потоков
    #38264230
denis_stell
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
landy,
Спасибо,ознакомлюсь.
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / вычисление числа пи с использованием потоков
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]