Loading...
lucky_9 avatar lucky_9 14 Точки

Multithreading & Multiprocessing Homework C++

Здравейте, това ми е домашното за лекцията за нишките в C++. Когато го пусна в debug mode и сложа breakpoints там къдто изчислява времето няма проблем, но когато го пусна без breakpoints в конзолата почти винаги изписва 0. Моля дайте съвети препоръки относно кода. Приемам всякаква градивна критика.

#include <iostream>
#include <thread>
#include <time.h>
#include <mutex>
#include <math.h>

using namespace std;

unsigned long long int fibNum = 0;
unsigned long int startTicks = 0;
bool overload = false;
unsigned int i = 0;
double timePeriod = 0;


mutex mtxPrimeLock;
mutex mtxFibLock;

bool isPrimeNum(unsigned long long int x)
{
    bool isPrime = false;
    int sqr = (int)sqrt(x);
    for (int i = sqr; i > 1; i--)
    {
        if (x % i == 0) { isPrime = false; break; }
        else { isPrime = true; }
    }
    return isPrime;
}

void findPrimeNumbers()
{
    unsigned long long int x = 1;

    while (x <= ULLONG_MAX)
    {
        x++;

        startTicks = clock();
        if (isPrimeNum(x))
        {
            mtxPrimeLock.lock();
            timePeriod = (double)(clock() - startTicks) / CLOCKS_PER_SEC;
            cout << "Prime number: " << x << " " << timePeriod << " sec" << endl;
            mtxPrimeLock.unlock();
        }
    }
}

int calcFibonacchi(int x)
{
        if (x == 0)
            return 0;
        if (x == 1)
            return 1;
        return  calcFibonacchi(x - 1) + calcFibonacchi(x - 2);
}

void printFibonacci()
{
    while (overload == false)
    {
        i++;
        startTicks = clock();
        fibNum = calcFibonacchi(i);
        
        mtxFibLock.lock();
        cout <<"Fibonacci number: " << fibNum << " " << ((double)(clock() - startTicks) / CLOCKS_PER_SEC) * 1000 << " ms"<< endl;
        mtxFibLock.unlock();

        if (ULLONG_MAX / 2 <= fibNum)
        {
            overload = true;
        }
    }
}


int main()
{
    thread threadFib(printFibonacci);
    thread threadPrimeNum(findPrimeNumbers);
    
    threadFib.join();
    threadPrimeNum.join();

    return 0;
}

 

Благодаря предварително !

Тагове:
0
C++ Programming
DenisDuev avatar DenisDuev 39 Точки
Best Answer

Метода с който взимаш времето е доста неточен, доколкото аз прочетох неточността е до 40ms със clock() и аз получавам 0, точно заради това, че операциите се извършват много бързо и не може да се вземе точна разлика, ползвай друг вид по точен часовник и ще стане. Също след всяко принтене набивам по един sleep за 200ms та да се види какво се принти иначе е мега бързо.

Аз ползвам това:

            auto begin = std::chrono::high_resolution_clock::now();
            auto end = std::chrono::high_resolution_clock::now();

и така им взимам разликата:
std::chrono::duration_cast<std::chrono::nanoseconds>(end - begin).count()

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.