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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
IMAGINARIUM
0 / 0 / 0
Регистрация: 06.01.2011
Сообщений: 17
#1

Многопоточный расчет числа пи - C++

23.11.2012, 02:02. Просмотров 1081. Ответов 0
Метки нет (Все метки)

Здравствуйте, уважаемые коллеги.

Мне нужно по учебе написать многопоточное приложение для вычисления числа пи с помощью WinAPI. Халявы не ищу, нужно просто поговорить как следует, если можно, помогите пожалуйста комментами в примере ниже.
Вот ТЗ:
"Напишите параллельную программу, вычисляющую число пи с точностью N знаков после запятой по следующей формуле:
http://www.cyberforum.ru/cgi-bin/latex.cgi?\pi = \frac{1}{n}\sum_{i = 0}^{n-1}\frac{4}{1+{{x}_{i}}^{2}}, где http://www.cyberforum.ru/cgi-bin/latex.cgi?{x}_{i} = \frac{i+0.5 }{n}

Установите n=1000000000. Создание потоков выполняйте с помощью функции CreateThread. Рекомендуется сразу в начале программы сразу создать необходимое количество потоков в приостановленном состоянии.
Произведите замер времени выполнения вашей программы. Проведите эксперименты для определения количества потоков в программе (от одного до 16), при котором достигается наибольшая скорость выполнения.

Используемые функции Win32 API: CreateThread, ResumeThread, SuspendThread
"

Причем надо реализовать два способа:

1) Статическое распределение итераций блоками (размер блока 100) по потокам.
Первый блок из 100 итераций выполняет нулевой поток, второй блок – следующий и т.д. до последнего потока, затем распределение снова начинается с нулевого потока
.

2) Статическое распределение итераций блоками (размер блока 100) по потокам.
Сначала каждый поток 100 итераций, тот поток, который заканчивает выполнение своей порции итераций, получает следующую свободную порцию из 100 итераций. Освободившиеся потоки получают новые порции итераций до тех пор, пока все порции не будут исчерпаны
.

Отсюда следующие вопросы:
1) я пока читаю книгу и курю MSDN, на нем есть большой пример с указанными функциями, но если честно, я не очень его понимаю, т.к. никогда ранее не работал с многопоточными приложениями и ничего о них не читал, мне хотелось бы, чтобы мне подсказали, откуда начинать и каким именно образом включать формулу. Даже не знаю, к чему больше относится мой вопрос: к теории или скорее к синтаксису, пока большой разрыв между теоретическими лекциями и книгами и реальным кодом в примере.
Вот код примера:
Кликните здесь для просмотра всего текста
C++
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
#include <windows.h>
#include <tchar.h>
#include <strsafe.h>
 
#define MAX_THREADS 3
#define BUF_SIZE 255
 
DWORD WINAPI MyThreadFunction( LPVOID lpParam );
void ErrorHandler(LPTSTR lpszFunction);
 
// Sample custom data structure for threads to use.
// This is passed by void pointer so it can be any data type
// that can be passed using a single void pointer (LPVOID).
typedef struct MyData {
    int val1;
    int val2;
} MYDATA, *PMYDATA;
 
 
int _tmain() /*пока неясен смысл всего мейна- понимаю, что создаются потоки, создается для них массив, а дальше непонятно*/
{
    PMYDATA pDataArray[MAX_THREADS];
    DWORD   dwThreadIdArray[MAX_THREADS];
    HANDLE  hThreadArray[MAX_THREADS]; 
 
    // Create MAX_THREADS worker threads.
 
    for( int i=0; i<MAX_THREADS; i++ )
    {
        // Allocate memory for thread data.
 
        pDataArray[i] = (PMYDATA) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
                sizeof(MYDATA));
 
        if( pDataArray[i] == NULL )
        {
           // If the array allocation fails, the system is out of memory
           // so there is no point in trying to print an error message.
           // Just terminate execution.
            ExitProcess(2);
        }
 
        // Generate unique data for each thread to work with.
 
        pDataArray[i]->val1 = i;
        pDataArray[i]->val2 = i+100;
 
        // Create the thread to begin execution on its own.
 
        hThreadArray[i] = CreateThread( 
            NULL,                   // default security attributes
            0,                      // use default stack size  
            MyThreadFunction,       // thread function name
            pDataArray[i],          // argument to thread function 
            0,                      // use default creation flags 
            &dwThreadIdArray[i]);   // returns the thread identifier 
 
 
        // Check the return value for success.
        // If CreateThread fails, terminate execution. 
        // This will automatically clean up threads and memory. 
 
        if (hThreadArray[i] == NULL) 
        {
           ErrorHandler(TEXT("CreateThread"));
           ExitProcess(3);
        }
    } // End of main thread creation loop.
 
    // Wait until all threads have terminated.
 
    WaitForMultipleObjects(MAX_THREADS, hThreadArray, TRUE, INFINITE);
 
    // Close all thread handles and free memory allocations.
 
    for(int i=0; i<MAX_THREADS; i++)
    {
        CloseHandle(hThreadArray[i]);
        if(pDataArray[i] != NULL)
        {
            HeapFree(GetProcessHeap(), 0, pDataArray[i]);
            pDataArray[i] = NULL;    // Ensure address is not reused.
        }
    }
 
    return 0;
}
 
 
DWORD WINAPI MyThreadFunction( LPVOID lpParam ) /* Как работает эта функция? В чем суть ее многопоточного применения?*/
{ 
    HANDLE hStdout;
    PMYDATA pDataArray;
 
    TCHAR msgBuf[BUF_SIZE];
    size_t cchStringSize;
    DWORD dwChars;
 
    // Make sure there is a console to receive output results. 
 
    hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
    if( hStdout == INVALID_HANDLE_VALUE )
        return 1;
 
    // Cast the parameter to the correct data type.
    // The pointer is known to be valid because 
    // it was checked for NULL before the thread was created.
 
    pDataArray = (PMYDATA)lpParam;
 
    // Print the parameter values using thread-safe functions.
 
    StringCchPrintf(msgBuf, BUF_SIZE, TEXT("Parameters = %d, %d\n"), 
        pDataArray->val1, pDataArray->val2); 
    StringCchLength(msgBuf, BUF_SIZE, &cchStringSize);
    WriteConsole(hStdout, msgBuf, (DWORD)cchStringSize, &dwChars, NULL);
 
    return 0; 
} 
 
 
 
void ErrorHandler(LPTSTR lpszFunction) 
{ 
   //...... аварийная функция
}

2) Затем мне это же надо будет сделать с помощью OpenMP, но у меня эта библиотека на работает на MS VS 2008 Express, подскажите пожалуйста, как можно ее вкрутить в студию экспресс?

Большое спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.11.2012, 02:02     Многопоточный расчет числа пи
Посмотрите здесь:

Рекурсивная функция, расчет степени числа - C++
Написать рекурсивную функцию для расчета степени n вещественного числа a (n – натуральное число).

Расчет факториала от потенциально бесконечного числа С++ - C++
Здравствуйте. Сравнительно недавно встала задача написать программу которая высчитывает факториал не стандартным методом, а конкретно...

Создать многопоточный таймер - C++
Мне надо создать многопоточный таймер,говоря иначе,мне надо,чтобы запускался таймер,а ты мог еще что-то делать в это...

Многопоточный обход графа в глубину - C++
Доброго времени суток. Подскажите многопоточный алгоритм обхода графа в глубину (нужно распараллелить алгоритм поиска компонент связности)....

Многопоточный чат с использованием пула потоков - C++
есть вопрос как реализовать можно чат с использованием пулов потоков.Без пула все понятно на каждого клиента создается поток и потоки висят...

Многопоточный парсер наилучшая структура и способ реализации - C++
Добрый день я хочу написать парсер и перед началом хотелось бы спросить про структуру парсера. Задача моего парсера парсить одновременно...

Многопоточный поиск в массиве и вывод результата в консоль и файл - C++
Всем привет. С наступающим праздником. Начинаю потихоньку осваивать многопоточность. Придумал себе задачу. Многопоточный поиск в...

Расчет интеграла в C++ - C++
Здравствуйте товарищи программисты. Мне нужна помощь в решении задачи на C++ Я в этом не очень понимаю, а по учебе надо. Задача: найти...

расчет по формуле - C++
не понимаю как на с++ записать выражение sin2beta и cos2beta вот задача:

Расчет треугольника - C++
В окно MFC вводятся длины двух сторон треугольника (1,2 строка) и величина угла между ними(3 строка). Найти третью сторону треугольника и...

Расчет BMI - C++
Наверно глупый вопрос или код. Второй день учу C++ Стивен Прата. И застрял на упражнение. Вроде все хорошо только BMI не правильно выводит ...

Расчет массива - C++
В чем-то ошибка, не хочет искать значения, не подскажете, в чем? #include &lt;stdio.h&gt; #include &lt;math.h&gt; #define N 20 int main() { ...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru