Я пытаюсь реализовать проблему философов Столовых в инструментах 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;