TryEnterCriticalSection всегда возвращает false - PullRequest
0 голосов
/ 06 января 2019

Я пытаюсь реализовать проблему философов Столовых в инструментах WINAPI. Моя цель - проверить, когда философы быстрее всего съели 1 миллион блюд. Однако я столкнулся с проблемой: каждый раз, когда я вызываю TryEnterCriticalSection, он возвращает false.

Это происходит, когда я проверяю, доступны ли две палочки для еды рядом с каждым философом для использования в функции. если это так, мы «едим» и поднимаем счетчик

мой главный:

int nums[] = { 1, 2, 3, 4, 5 };
// initializes the critical sections
InitializeCriticalSection(&chopstick1);
InitializeCriticalSection(&chopstick2);
InitializeCriticalSection(&chopstick3);
InitializeCriticalSection(&chopstick4);
InitializeCriticalSection(&chopstick5);

// philosophers;
HANDLE WINAPI Phils[] = {
CreateThread(NULL, 0, threadFunc, &nums[0], 0, NULL),
CreateThread(NULL, 0, threadFunc, &nums[1], 0, NULL),
CreateThread(NULL, 0, threadFunc, &nums[2], 0, NULL),
CreateThread(NULL, 0, threadFunc, &nums[3], 0, NULL),
CreateThread(NULL, 0, threadFunc, &nums[4], 0, NULL)
};


WaitForMultipleObjects(5, Phils, TRUE, INFINITE);


return 0;

Мой thread_func:

    std::cout << "dev\n";
time_t before;
time_t after;
// before actions
time(&before);
int count = 0;
int* numP = (int*)lpParam;
int num = *numP;

if (num != 5 && num != 1)
{
    while (count < 1000000)
    {
        bool chop1 = TryEnterCriticalSection(&chopsticks[num - 2]);
        bool chop2 = TryEnterCriticalSection(&chopsticks[num]);
        if (chop1 == true && chop2 == true)
        {
            //enters
            EnterCriticalSection(&chopsticks[num - 2]);
            EnterCriticalSection(&chopsticks[num]);
            //eats
            count++;
            //leaves
            LeaveCriticalSection(&chopsticks[num - 2]);
            LeaveCriticalSection(&chopsticks[num]);
        }
    }
}
// if its the last one
if (num == 5)
{
    while (count < 1000000)
    {
        if (TryEnterCriticalSection(&chopsticks[num - 2]) && TryEnterCriticalSection(&chopsticks[0]))
        {
            //enters
            EnterCriticalSection(&chopsticks[num - 2]);
            EnterCriticalSection(&chopsticks[num]);
            //eats
            count++;
            //leaves
            LeaveCriticalSection(&chopsticks[num - 2]);
            LeaveCriticalSection(&chopsticks[num]);
        }
    }
}
// if its the first philosofer
if (num == 1)
{
    while (count < 1000000)
    {
        if (TryEnterCriticalSection(&chopsticks[4]) && TryEnterCriticalSection(&chopsticks[num - 1]))
        {
            //enters
            EnterCriticalSection(&chopsticks[num - 2]);
            EnterCriticalSection(&chopsticks[num]);
            //eats
            count++;
            //leaves
            LeaveCriticalSection(&chopsticks[num - 2]);
            LeaveCriticalSection(&chopsticks[num]);
        }
    }
}

time(&after);
std::cout << "Philosofer NO" << num << ": ate one million times for " << difftime(after, before) << " seconds" << std::endl;
return 0;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...