Проблема обедающих философов с критическим разделом

Я пытаюсь решить проблему обедающих философов и каждый раз печатаю, что едят только двое. Каждый созданный мной поток был философом, и каждый раздел был вилкой, и в соответствии с алгоритмом, каждый раз, когда мы отправляем философа, мы пытаемся получить его вилки (в первую очередь это fork1 и fork2), а вилки являются критическими секциями. Есть идеи, как это исправить? Вот мой код:

    #include <windows.h>
    #include <stdio.h>
    #include <tchar.h>
    #include <tchar.h>
    #include <iostream>
    #include <chrono>//To check runtime(it was also asked but I know how to do this)
    #include <thread>
    using namespace std;
    
    CRITICAL_SECTION ghCARITICALSection1;
    CRITICAL_SECTION ghCARITICALSection2;
    //Same for the rest
    DWORD WINAPI func(int* phiphilosopher)
    {
        if (1 == *phiphilosopher)
        {
            if (TryEnterCriticalSection(&ghCARITICALSection1)) {
                if (TryEnterCriticalSection(&ghCARITICALSection2)) {
                    cout << "1 is eating..."<< endl;
                    for (int i = 0; i < 1000000; i++)
                    {
                        i = i;
                    }
                    LeaveCriticalSection(&ghCARITICALSection2);
                }
                LeaveCriticalSection(&ghCARITICALSection1);
            }
        }
    //Same for the rest but with all the numbers increased and on the 5th we check 5 and 1

И это главное:

    int main()
    {
        int philosopher1 = 1;
        int* philosopher1ptr = &philosopher1;
        //Same for the rest
    
        InitializeCriticalSection(&ghCARITICALSection1);
        InitializeCriticalSection(&ghCARITICALSection2);
//Same for the rest
    
        HANDLE WINAPI th1 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)func, philosopher1ptr, 0, NULL);
//Same for the rest
    
        WaitForSingleObject(th1, INFINITE);
        //Same for the rest
    }

person Velanar32    schedule 17.01.2021    source источник
comment
В чем проблема обедающих философов?   -  person Retired Ninja    schedule 17.01.2021
comment
Проверьте здесь: ссылка   -  person Velanar32    schedule 17.01.2021
comment
Описание вашей проблемы относится непосредственно к вопросу.   -  person Retired Ninja    schedule 17.01.2021
comment
Не думаю, что полностью понимаю, что вы имеете в виду.   -  person Velanar32    schedule 17.01.2021
comment
Что ж, если вы попробуете задачу с 5 философами, то самое большее 2 должны есть.   -  person Phil1970    schedule 17.01.2021
comment
Как новый пользователь, пройдите тур и прочтите Как спросить. В частности, вы на самом деле не описываете проблему, а спрашиваете, как ее решить. Что касается вашего вопроса, предоставьте минимальный воспроизводимый пример, даже если это просто означает склейку двух фрагментов вместе. Убедитесь, что в нем нет ненужных вещей! Кстати: почему вы не используете потоки C ++, а (непереносимые) функции Win32 API?   -  person Ulrich Eckhardt    schedule 17.01.2021
comment
Я знаю, что самое большее 2 должны есть, но это только печатает, что 2 едят, а остальные пропускает. Когда я запускаю его, я получаю ‹number› ест ... а ‹number› - это то, что присылают как философ. Я использую Win32 API, потому что это школьное задание ...   -  person Velanar32    schedule 18.01.2021
comment
Этот вопрос задавался раньше (см., Например, здесь). Это ни хорошо исследовано, ни демонстрирует хотя бы базовое знакомство с проблемной областью. Документация для CreateThread явно заявляет, что вы не можете использовать его так, как вы его используете.   -  person IInspectable    schedule 18.01.2021
comment
Говоря о недостаточно изученных, я сделал то, что было написано в моем решении, и я написал это в своем коде, но это все равно произошло. Я понимаю, что неправильно использую, но это то, что требуется в задаче. Кстати, мне очень понравилось, как вместо того, чтобы помогать мне и исправлять ответ ниже, который вы сказали, что он плохой, вы просто направляли людей на кнопку «против».   -  person Velanar32    schedule 18.01.2021
comment
Приятно видеть, что вам нравятся правила Stack Overflow. Если вы хотите узнать больше, пройдите тур, который является обычным для каждого нового пользователя. Как ни странно, вы этого не сделали.   -  person IInspectable    schedule 19.01.2021


Ответы (1)


возможно, два или более потока обращаются к одному и тому же критическому разделу и перекрывают друг друга. попробуйте добавить таймер между каждым созданием потока.

HANDLE WINAPI th1 = CreateThread(...);
std::this_thread::sleep_for(std::chrono::milliseconds(100));
HANDLE WINAPI th2 = CreateThread(...);
person user15024839    schedule 17.01.2021
comment
почему вы используете std sleep и winapi CreateThread? - person apple apple; 17.01.2021
comment
Извините, но нет: вы всегда можете изменить поведение многопоточных программ, добавив задержки, чтобы предотвратить различные нежелательные состояния, хотя это не решение. Если вы все сделаете правильно, то сможете сделать это без задержек. - person Ulrich Eckhardt; 17.01.2021
comment
@ulr Рядом с предложенным ответом есть стрелка, направленная вниз. Его всплывающая подсказка гласит: Этот ответ бесполезен. После того, как вы правильно определили этот предложенный ответ как бесполезный, почему вы не щелкнули стрелку, чтобы сообщить другим читателям? Это ужасно? Это новый участник, так что будьте осторожны и снова возьметесь за подножку? - person IInspectable; 18.01.2021
comment
@IInspectable, да, вроде как: плохой ответ - это одно, а плохой ответ, который принимается как правильный ответ, - это совсем другое. Я думаю, это требует небольшого обсуждения. - person Ulrich Eckhardt; 18.01.2021
comment
@ulr для меня это сработало. - person Velanar32; 18.01.2021
comment
@ulr Оцените ли вы предложенный ответ как полезный или нет, может зависеть от личных предпочтений. Однако предлагаемый ответ является опасным, поскольку по-видимому решает проблему. Это ОБЯЗАТЕЛЬНО голосование против. Никакого обсуждения не требуется. - person IInspectable; 18.01.2021
comment
Холод, @IInspectable. Я в основном разделяю ваше мнение, но это еще не хороший вопрос и не лучший ответ. У меня все еще есть немного надежды на диалог. Я бы предпочел сначала закрыть вопрос, так как он все еще некачественный, поэтому ответ также становится невидимым. Или, может быть, оба улучшились. - person Ulrich Eckhardt; 19.01.2021