Обеденные пинхлоферы с использованием темы и критического отбора - PullRequest
0 голосов
/ 26 января 2020

Я пишу эту программу, чтобы решить философов-столовых, и мне нужно запустить эту программу и проверить, сколько времени понадобилось всем философам, чтобы съесть миллион раз

Можете ли вы помочь мне с этой частью проверки миллион раз?

это моя программа:

#include <iostream>
#include <Windows.h>
#include <time.h>

HANDLE WINAPI philosopher[5];
CRITICAL_SECTION chopstick[5];

DWORD WINAPI func(int p)
{
    std::cout << "Philosopher" << p << "is thinking" << std::endl;
    TryEnterCriticalSection(&chopstick[p]);
    TryEnterCriticalSection(&chopstick[(p + 1) % 5]);
    std::cout << "Philosopher" << p << "is eating" << std::endl;
    Sleep(300);
    LeaveCriticalSection(&chopstick[p]);
    LeaveCriticalSection(&chopstick[(p + 1) % 5]);
    std::cout << "Philosopher" << p << "finish" << std::endl;
    return 0;
}

int main()
{
    clock_t t;
    t = clock();
    int i;

    for (i = 0; i < 5; i++)
    {
        InitializeCriticalSection(&chopstick[i]);
    }
    for (i = 0; i < 5; i++)
    {
        int count;
        count = 0;
        philosopher[i] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)func,(LPVOID)(i), 0, NULL);
    }
    for (i = 0; i < 5; i++)
    {
        WaitForSingleObject(philosopher[i], INFINITE);
    }

    t = clock() - t;
    std::cout << "seconds " << ((float)t) / CLOCKS_PER_SEC << std::endl;
    return 0;
}

1 Ответ

0 голосов
/ 26 января 2020

Вам нужно будет создать часы () в потоках, вернуть время, затраченное в философии [i], и сложить их вместе в конце:

DWORD WINAPI func(int p)
{
    clock_t t;
    t = clock();
    std::cout << "Philosopher" << p << "is thinking" << std::endl;
    TryEnterCriticalSection(&chopstick[p]);
    TryEnterCriticalSection(&chopstick[(p + 1) % 5]);
    std::cout << "Philosopher" << p << "is eating" << std::endl;
    Sleep(300);
    LeaveCriticalSection(&chopstick[p]);
    LeaveCriticalSection(&chopstick[(p + 1) % 5]);
    std::cout << "Philosopher" << p << "finish" << std::endl;
     t = clock() - t;
    return t;
}

int main()
{
    clock_t t;
    t = clock();
    int i;

    for (i = 0; i < 5; i++)
    {
        InitializeCriticalSection(&chopstick[i]);
    }
    for (i = 0; i < 5; i++)
    {
        int count;
        count = 0;
        philosopher[i] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)func,(LPVOID)(i), 0, NULL);
    }
    for (i = 0; i < 5; i++)
    {
        WaitForSingleObject(philosopher[i], INFINITE);
    }
    for (i = 0; i < 5; i++)
    {
        clock_t total;
        total += philosopher[i];
    }    

    t = clock() - t;
    total += t;
    std::cout << "seconds " << ((float)total) / CLOCKS_PER_SEC << std::endl;
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...