Форум программистов, компьютерный форум CyberForum.ru

Задача о философах с использованием событий - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Организовать введение данных в массив , обработку элементов и выведение результатов используя указатели. Дано натуральное число N и одномерный массив http://www.cyberforum.ru/cpp-beginners/thread1115939.html
Организовать введение данных в массив , обработку элементов и выведение результатов используя указатели. Дано натуральное число N и одномерный массив А1, А2,...,AN целых чисел. Найти три не находящихся рядом числа, умножение котах равняется Р. B C++!
C++ Dev Cpp Решение системы алгебраических уравнений компактным методом исключения Здравствуйте! Есть задание, "решение системы алгебраических уравнений компактным методом исключения. Коэффициенты обрабатываются в двух матрицах, матрица действительной части и матрица мнимой части комплексного числа в алгебраической форме." На входе - txt файл с коэффициентами системы в виде матрицы размером N строк на N+1 столбцов, в N+1 столбце - свободные члены системы, коэффициенты -... http://www.cyberforum.ru/cpp-beginners/thread1115928.html
C++ Массив. нужно перемножить элементы столбика и вывести результат
я понял только как считать всю инф. с файла, а вот как перемножить теперь эл-ты 1 столбца? #include <iostream> #include <fstream> #include <iomanip> #include <stdlib.h> using namespace std; int main() { setlocale (LC_ALL, "RUS"); int n=0;
C++ более компактный код
нужна замыниты вес то что я написал в функции void n() на более компактный код (суть кода выравнивать столбик ) //Calculator #include<iostream> #include<conio.h> using namespace std;
C++ Сериализация и десериализация двусвязного списка http://www.cyberforum.ru/cpp-beginners/thread1115917.html
Ребят, помогите плиз решить задачу, которые сутки сижу нифига не получается(( Может я просто, глупый((( Реализуйте функции сериализации и десериализации двусвязного списка, заданного следующим образом: struct ListNode { ListNode * prev; ListNode * next; ListNode * rand; // указатель на произвольный элемент данного списка std::string data; };
C++ OpenMP в Dev CPP как подключить openMP в DevCPP? подробнее

Показать сообщение отдельно
NNN7
7 / 7 / 3
Регистрация: 05.09.2013
Сообщений: 503
11.03.2014, 00:58     Задача о философах с использованием событий
Пытаюсь разобраться с этой задачей .
Задача: за круглым столом сидят философы. Их жизненный цикл состоит из двух состояний: ест и думает. Ест он двумя вилками - правой и левой, а вилки расположены не каждому по две, а между каждыми двумя философами по одной. Когда один ест - вилки вокруг него блокируются событиями, а если хотя бы одна из вилок занята - он просто забивает на еду и начинает думать.
Поискал в интернете и нашёл такой пример:
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
#include "stdafx.h"
#include "windows.h"
#include "conio.h"
#include "stdlib.h"
 
#define min 100
#define max 500
#define step 4
#define kol 5
 
HANDLE some[kol]; 
HANDLE Philosopher[kol];
 
LPTHREAD_START_ROUTINE WINAPI philosopher(LPVOID arg)
{
    int left_fork = (int)arg, right_fork = left_fork+1;
 
    for(int i = 0; i < step; i++)   //повторяет 4 раза
    {
        Sleep(min + rand()%(max-min)); //задержка
        printf("Philosopher[%i] want to eat.\n", left_fork);
        printf("Try to cath forks.\n");
        printf("Left[%i] and right[%i] forks - ", left_fork, right_fork);
        //проверка вилок
        if (WaitForSingleObject(some[left_fork], 1) != WAIT_OBJECT_0 &
            WaitForSingleObject(some[right_fork], 1) != WAIT_OBJECT_0) 
        {
            printf("success.\n");
            SetEvent(some[left_fork]);  //объект "событие" в сигнальное состояние
            SetEvent(some[right_fork]); //объект "событие" в сигнальное состояние
            printf("Eating.");          //философ ест
            Sleep(min + rand()%(max-min));
            ResetEvent(some[left_fork]); //сброс события
            ResetEvent(some[right_fork]);//сброс события
        }
        else printf("failed.\n");       //философу не удалось поесть
 
        Sleep(min + rand()%(max-min));
        printf("Philosopher[%i] THINKING.\n", left_fork); //философ думает
    }
  
 
    return 0;
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    for (int i = 0; i <kol; i++)
    {
        some[i] = CreateEvent(NULL, TRUE, TRUE, NULL); //тип сброса- ручной
        ResetEvent(some[i]);
    }
    for (int i = 0; i < kol; i++)
    {
        Philosopher[i] = CreateThread(NULL, 0, philosopher((LPVOID)i), NULL, 0, NULL);
    }
    return 0;
}
Но он вылетает , после того , как 1-ый философ закончит. То ест , ко 2-ому дело не доходит .
Вроде всё более менее понятно , кроме пару моментов: каким образом задаются значения левой и правой вилки ? написано -
C++
1
 int left_fork = (int)arg, right_fork = left_fork+1;
- что это означает , понять не могу
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 16:57. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru