Добавил:
Кафедра ВТ Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

3 лаба / main

.cpp
Скачиваний:
9
Добавлен:
04.02.2022
Размер:
2.17 Кб
Скачать
#include <iostream>
#include <windows.h>
#include <time.h>
using std::cout;
using std::endl;

const int N = 100000000, BLOCKSIZE = 9308310, MAX_THREADS = 8, TIMES = 10;

int currentPos = 0;
double pi = 0.0;
LPCRITICAL_SECTION section = new CRITICAL_SECTION;

DWORD WINAPI MyThreadFunction(LPVOID lpParam){
    int* first = (int*)lpParam;
    int end = *first + BLOCKSIZE;
    long double x, tempPi;

    while (*first < N){
        tempPi = 0.0;
        for (int i = *first; (i < end) && (i < N); ++i){
            x = (i + 0.5) / N;
            tempPi += (4 / (1 + x*x));
        }
        EnterCriticalSection(section);
        pi += tempPi;
        currentPos += BLOCKSIZE;
        *first = currentPos;
        LeaveCriticalSection(section);
        end = *first + BLOCKSIZE;
    }
    return 0;
}

int main(){   
    DWORD t1;
    HANDLE hThreadArray[MAX_THREADS];
    int position[MAX_THREADS];
    double averageTime = 0.0;
    for (int j = 0; j < TIMES; j++){
        pi = 0.0;
        InitializeCriticalSection(section);

        for (int i = 0; i < MAX_THREADS; ++i){
            position[i] = BLOCKSIZE * i;
            currentPos = position[i];
            hThreadArray[i] = CreateThread(
                NULL,               // default security attributes
                0,                  // use default stack size  
                MyThreadFunction,   // thread function name
                &position[i],       // аргументы для поточной функции
                CREATE_SUSPENDED,   // создается остановленным
                NULL);              // returns the thread identifier
        }
        t1 = clock();

        for (int i = 0; i < MAX_THREADS; ++i)
            ResumeThread(hThreadArray[i]);
        WaitForMultipleObjects(MAX_THREADS, hThreadArray, TRUE, INFINITE);

        pi /= (long double)N;
        DeleteCriticalSection(section);
        averageTime += clock() - t1;
        for (int i = 0; i < MAX_THREADS; ++i)
            CloseHandle(hThreadArray[i]);
    }
    
    printf("pi: %.10lf\n",pi);
    cout << "Average time: " << (long double)(averageTime / TIMES) / CLOCKS_PER_SEC << endl;

}
Соседние файлы в папке 3 лаба