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

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

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

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

23.11.2012, 02:02. Просмотров 1053. Ответов 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++
Расчет сумм в формуле и расчет xi должны быть оформлены в виде отдельных функций. C++
C++ Как написать программу-калькулятор чтобы было можно додавать 2 числа, 3 числа, 4 числа, n чисел?
C++ Расчет интегралов
C++ Расчет треугольника
C++ Поменять одну из цифр первого числа с цифрой второго числа, чтобы получившиеся числа были взаимно простыми
Многопоточный чат с использованием пула потоков C++
Расчет интервала C++
Создать многопоточный таймер C++
Рекурсивная функция, расчет степени числа C++
C++ Многопоточный парсер наилучшая структура и способ реализации
Расчет факториала от потенциально бесконечного числа С++ C++

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

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

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