Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.84/25: Рейтинг темы: голосов - 25, средняя оценка - 4.84
1 / 1 / 1
Регистрация: 27.08.2016
Сообщений: 27
1

Многопоточность: задача об обедающих философах

03.11.2019, 20:05. Показов 4480. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток!
Нужно перевести код с С++ с использованием библиотеки <thread> и <mutex> на WinAPI.
Программа представляет собой решение задачи обедающих философов, вот код с библиотеками:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include <iostream>
#include <mutex>
#include <thread>
#include <Windows.h>
 
#define P 5
 
std::thread threads[P]; //my philosophers
std::mutex mtx[P]; //forks
std::mutex cout_lock;
 
 
bool pickUp(int left, int right) {
    if (mtx[left].try_lock()) {
        if (mtx[right].try_lock()) {
            return true;
        }
        else {
            mtx[left].unlock();
        }
    }
    return false;
}
 
void putDown(int left, int right) {
    mtx[left].unlock();
    mtx[right].unlock();
}
 
void run(int philID) {
    int leftIndex = philID - 1;
    int rightIndex = (philID) % (P - 1);
    while (1) {
        if (pickUp(leftIndex, rightIndex)) {
            cout_lock.lock();
            std::cout << "Philosopher " << philID << " eats.\n";
            cout_lock.unlock();
 
            Sleep(rand() % 200);
            putDown(leftIndex, rightIndex);
        }
        else {
            cout_lock.lock();
            std::cout << "Philosopher " << philID << " thinks.\n";
            cout_lock.unlock();
            Sleep(rand() % 200);
        }
    }
}
int main() {
    for (int i = 1; i <= P; i++) {
        threads[i - 1] = std::thread(run, i);
 
    }
    for (int i = 1; i <= P; i++) {
            threads[i - 1].join();
    }
    return 0;
}
А здесь результаты моих попыток перевести код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include <windows.h>
#include <mutex>
#include <iostream>
 
std::mutex cout_lock;
using namespace std;
 
#define P 5
 
HANDLE hThreads[P];
HANDLE mtx[P];
 
 
bool pickUp(int left, int right) {
 
    if (WaitForSingleObject(mtx[left], 0) == WAIT_OBJECT_0) {
        if (WaitForSingleObject(mtx[right], 0) == WAIT_OBJECT_0) {
            return true;
        }
        else {
            ReleaseMutex(mtx[left]);
        }
    }
    return false;
}
 
void putDown(int left, int right) {
    ReleaseMutex(mtx[left]);
    ReleaseMutex(mtx[right]);
}
 
DWORD WINAPI Run(CONST LPVOID philID ) {
    int leftIndex = *philID - 1;
    int rightIndex = (*philID) % (P - 1);
    while (1) {
        if (pickUp(leftIndex, rightIndex)) {
            cout_lock.lock();
            std::cout << "Philosopher " << *philID << " eats.\n";
            cout_lock.unlock();
 
            Sleep(rand() % 200);
            putDown(leftIndex, rightIndex);
        }
        else {
            cout_lock.lock();
            std::cout << "Philosopher " << *philID << " thinks.\n";
            cout_lock.unlock();
            Sleep(rand() % 200);
        }
    }
}
 
int main() {
 
    for (int i = 0; i < P; i++) {
        mtx[i] = CreateMutex(NULL, FALSE, NULL);
    }
 
    for (int i = 0; i < P; i++) {
        hThreads[i] = CreateThread(NULL, 0, &Run, i, 0, NULL);
    }
 
    WaitForMultipleObjects(P, hThreads, TRUE, INFINITE);
 
    for (int i = 0; i < P; i++) {
        CloseHandle(hThreads[i]);
    }
    CloseHandle(mtx);
    ExitProcess(0);
}
Столкнулся с такими проблемами:
1) Как передать в функцию Run - int (в строке hThreads[i] = CreateThread(NULL, 0, &Run, i, 0, NULL)
2) Правильно ли я реализовал функцию pickUp?
3) Правильно ли реализовал функцию Run?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.11.2019, 20:05
Ответы с готовыми решениями:

Задача об обедающих философах
Тема заезженная,но все таки. Интересует решение задачи &quot;Обедающих философов&quot;. Мне надо сделать...

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

Ординарная Сеть Петри для задачи об "обедающих философах"
Помогите с сетью Петри. дуб в этом Задача об обедающих философах. Пять философов отдыхают в...

Многопоточность, задача об обедающих философах (семафоры)
#include &quot;iostream&quot; #include &quot;string&quot; #include &quot;windows.h&quot; #include &quot;process.h&quot; #include...

1
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
03.11.2019, 20:21 2
Лучший ответ Сообщение было отмечено Garfield01 как решение

Решение

Цитата Сообщение от Garfield01 Посмотреть сообщение
Нужно перевести код с С++ с использованием библиотеки <thread> и <mutex> на WinAPI.
Вместо std::mutex нужно использовать Critical Sections

Добавлено через 1 минуту
Цитата Сообщение от Garfield01 Посмотреть сообщение
3) Правильно ли реализовал функцию Run?
C++
1
2
3
DWORD WINAPI Run(CONST LPVOID philID ) {
    int leftIndex = int(philID) - 1;
    int rightIndex = int(philID) % (P - 1);
Добавлено через 46 секунд
Цитата Сообщение от Garfield01 Посмотреть сообщение
1) Как передать в функцию Run - int (в строке hThreads[i] = CreateThread(NULL, 0, &Run, i, 0, NULL)
CreateThread(NULL, 0, &Run, (LPVOID)i, 0, NULL)

Добавлено через 2 минуты
Цитата Сообщение от Garfield01 Посмотреть сообщение
2) Правильно ли я реализовал функцию pickUp?
Соответственно, здесь должно быть TryEnterCriticalSection, вместо try_lock

Добавлено через 3 минуты
А так, да, правильно
1
03.11.2019, 20:21
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.11.2019, 20:21
Помогаю со студенческими работами здесь

Задача об обедающих философах
Доброго времени суток! Поиском пользовался, но ответа для себя не нашёл, поэтому создаю тему. ...

Задача об обедающих философах [C++|Linux|ARM Mitel5000]
Всем привет) Собственно несколько дней я ковыряюсь с проблемой и не знаю как её решить) Условия...

Задача о философах с использованием событий
Пытаюсь разобраться с этой задачей . Задача: за круглым столом сидят философы. Их жизненный цикл...

задача про обедающих философов
Здравствуйте! Делаю программу про обедающих философов. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru