Форум программистов, компьютерный форум, киберфорум
Наши страницы

Потоки. Event. Задача про обедающих философов. - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Контрольная http://www.cyberforum.ru/cpp-beginners/thread549459.html
Помогите с контрольной пожалуйста Задание
C++ Итератор для списка #include <iostream> using namespace std; template <class T> class Link { public: T value; Link *nextLink; Link( T v, Link<T>* n ) : value ( v ), nextLink ( n ) {} }; http://www.cyberforum.ru/cpp-beginners/thread549447.html
Запуск программы с удаленного сервера C++
Допустим мы запускаем у себя программу, лежащюю на удаленном сервере(не наша подсеть) и в процессе своей работы программа обращается к IP 10.1.10.1 Вопрос: программа обратится к этому адресу в...
C++ Делаю сапёр. что тут не так????
#include<iostream.h> #include<dos.h> #include<time.h> #include<stdio.h> #include<stdlib.h> #include<conio.h> int main (void) {
C++ Не могу найти ошибку http://www.cyberforum.ru/cpp-beginners/thread549429.html
Добрый день. Есть код #include <stdio.h> #include <conio.h> #include <math.h> struct tbook {
C++ Итерационный метод удаления бинарного дерева Есть бинарное дерево поиска нужно создать итерационный метод удаления дерева. Вот есть функция удаления дерева но при удалении происходит ошибка вот такая: Необработанное исключение в "0x64bd12b4" в... подробнее

Показать сообщение отдельно
VIPerZ
7 / 7 / 0
Регистрация: 26.02.2011
Сообщений: 69
16.04.2012, 15:49  [ТС]
Немного пофиксил проблему номеров, теперь с ними всё работает абсолютно четко, я разобрался с тем как работают события с помощью экспериментов, но теперь возник ещё один вопрос - иногда соседний философ тоже хватает вилки, хотя они уже заняты другим потоком и события на них стоят!

Почти-почти рабочий код:
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
// lab1_OS2.cpp: определяет точку входа для консольного приложения.
//обедающие философы
 
#include "stdafx.h"
#include "windows.h"
#include "conio.h"
#include "stdlib.h"
 
#define min_time 300
#define max_time 1700
#define step 4
#define phil_count 10
 
//event for gathering into threads numbers of philophers
HANDLE iteratorControl = CreateEvent(NULL, TRUE, TRUE, NULL);//manual reset, init non-signaled
int philosopher_number = 0;
 
//event for unbreakable part of philopher activity
//CRITICAL_SECTION philosopherControl;
//HANDLE philosopherControl2 = CreateEvent(NULL, TRUE, TRUE, NULL);//manual reset, init non-signaled
 
//events for forks and threads for filosophers
HANDLE some[phil_count]; 
HANDLE Philosophers[phil_count];
 
DWORD WINAPI philosopher(LPVOID arg)
{
    //const because somehow this value changes for all threads in random way :D
    const int left_fork = philosopher_number, right_fork = philosopher_number+1;
    SetEvent(iteratorControl); //this event return control to other threads after getting self number
    for(int i = 0; i < step; i++)
    {
        Sleep(min_time + rand()%(max_time-min_time)); //some delay
        //TryEnterCriticalSection(&philosopherControl);     //unbreakable piece of activity (start)
        //WaitForSingleObject(philosopherControl2, INFINITE);
        //ResetEvent(philosopherControl2);
        printf("Philosopher[%i] want to eat.\n", left_fork);
        if (WaitForSingleObject(some[left_fork], 1) == WAIT_TIMEOUT)     
        {
            if (WaitForSingleObject(some[right_fork], 1) == WAIT_TIMEOUT)
            {
                printf("L[%i] n r[%i] forks - success.\n", left_fork, right_fork);
                //occupy forks
                SetEvent(some[left_fork]);
                SetEvent(some[right_fork]);
                printf("begin Eating[%i].\n", left_fork);
                //LeaveCriticalSection(&philosopherControl); //unbreakable piece of activity (stop)
                //SetEvent(philosopherControl2);
                Sleep(min_time + rand()%(max_time-min_time)); //some delay
                printf("end   Eating[%i].\n", left_fork);
                //unoccupy forks
                ResetEvent(some[left_fork]);
                ResetEvent(some[right_fork]);
            }
        }
        else if ((WaitForSingleObject(some[left_fork], 1) == WAIT_OBJECT_0) ||
            (WaitForSingleObject(some[right_fork], 1) == WAIT_OBJECT_0))
        { 
            printf("L[%i] n r[%i] forks - failed.\n", left_fork, right_fork); 
            //LeaveCriticalSection(&philosopherControl); //unbreakable piece of activity (stop)
            //SetEvent(philosopherControl2);
        }
 
        Sleep(min_time + rand()%(max_time-min_time)); //some delay
        printf("Philosopher[%i] thinking.\n", left_fork);
    }
    printf("Philosopher%i EXITING the program. \n", left_fork);
    return 0;
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    for (int i = 0; i < phil_count; i++)
        some[i] = CreateEvent(NULL, TRUE, FALSE, NULL); //FALSE - auto-reset, TRUE - intial state is singaled
 
    for (int i = 0; i < phil_count; i++)
    {
        WaitForSingleObject(iteratorControl, INFINITE);
        ResetEvent(iteratorControl); //lock other threads to catch the right self number
        philosopher_number = i;
        Philosophers[i] = CreateThread(NULL, 0, philosopher, NULL, 0, NULL);
    }
 
    /*int test1, test2, test3, test4, test5, test6;
    test1 = WAIT_OBJECT_0;
    test2 = WAIT_ABANDONED;
    test3 = WAIT_TIMEOUT;
    test4 = WAIT_FAILED;
 
    test5 = WaitForSingleObject(some[0], 1);
    SetEvent(some[0]);
    test5 = WaitForSingleObject(some[0], 1);
    ResetEvent(some[0]);
    test5 = WaitForSingleObject(some[0], 1);
    
    test6 = WaitForSingleObject(some[1], 1);
    SetEvent(some[1]);
    test6 = WaitForSingleObject(some[1], 1);
    ResetEvent(some[1]);
    test6 = WaitForSingleObject(some[1], 1);*/
 
    getch();
    return 0;
}
Добавлено через 5 минут
Всё было бы правильно, если бы в выводе после begin eat[number] , если появляется попытка захватить вилки, где есть вилка с этим же номером - то должно быть фейлд, и саксес только после end eating[number] , а там почему-то частенько проскакивает саксес

Добавлено через 1 час 55 минут
Окончательный, правильно работающий код, обрабатывающий философов ровно в той последовательности, как они начали хотеть есть.
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
// lab1_OS2.cpp: определяет точку входа для консольного приложения.
//обедающие философы
 
#include "stdafx.h"
#include "windows.h"
#include "conio.h"
#include "stdlib.h"
#include "list"
 
#define min_time 300
#define max_time 1700
#define step 2
#define phil_count 5
 
using namespace std;
 
list<int> Threads_sequence;
 
//event for gathering into threads numbers of philophers
HANDLE iteratorControl = CreateEvent(NULL, TRUE, TRUE, NULL);//manual reset, init signaled
int philosopher_number = 0;
 
//cs for unbreakable part of philosopher activity
CRITICAL_SECTION philosopherControl; 
 
//events for forks and threads for philosophers
HANDLE some[phil_count]; 
HANDLE Philosophers[phil_count];
 
DWORD WINAPI philosopher(LPVOID arg)
{
    //const because somehow this value changes for all threads in random way :D
    const int left_fork = philosopher_number, right_fork = philosopher_number+1;
    SetEvent(iteratorControl); //this event return control to other threads after getting self number
    for(int i = 0; i < step; i++)
    {
        Sleep(min_time + rand()%(max_time-min_time)); //some delay
        Threads_sequence.push_back(left_fork);
                            //cycle for right sequence of threads critical section entering
                            while(true)
                            {
                                if (Threads_sequence.front() == left_fork) { Threads_sequence.pop_back(); break; }
                                else continue;
                            }
        EnterCriticalSection(&philosopherControl);     //unbreakable piece of activity (start)
        if (WaitForSingleObject(some[left_fork], 1) == WAIT_TIMEOUT)     
        {
            if (WaitForSingleObject(some[right_fork], 1) == WAIT_TIMEOUT)
            {
                printf("Philosopher[%i] want to eat. L[%i] n r[%i] forks - success.\n", left_fork, left_fork, right_fork);
                //occupy forks
                SetEvent(some[left_fork]);
                SetEvent(some[right_fork]);
                LeaveCriticalSection(&philosopherControl); //unbreakable piece of activity (stop)
                printf("begin Eating[%i].\n", left_fork);
                Sleep(min_time + rand()%(max_time-min_time)); //some delay
                //unoccupy forks
                ResetEvent(some[left_fork]);
                ResetEvent(some[right_fork]);
                printf("end   Eating[%i].\n", left_fork);
            }
            else if (WaitForSingleObject(some[right_fork], 1) == WAIT_OBJECT_0)
            {
                printf("Philosopher[%i] want to eat. R[%i] fork - failed.\n", left_fork, right_fork);
            }
        }
        else if (WaitForSingleObject(some[left_fork], 1) == WAIT_OBJECT_0)
        {
            printf("Philosopher[%i] want to eat. L[%i] fork - failed.\n", left_fork, left_fork);
        }
        else if (WaitForSingleObject(some[right_fork], 1) == WAIT_OBJECT_0)
        {
            printf("Philosopher[%i] want to eat. R[%i] fork - failed.\n", left_fork, right_fork);
        }
        else if ((WaitForSingleObject(some[right_fork], 1) == WAIT_OBJECT_0) & (WaitForSingleObject(some[left_fork], 1) == WAIT_OBJECT_0))
        {
            printf("Philosopher[%i] want to eat. L[%i] n r[%i] forks - failed.\n", left_fork, left_fork, right_fork);
        }
        else 
        {
            printf("Philosopher[%i] want to eat. Error on [%i].\n", left_fork, left_fork);
        }
        LeaveCriticalSection(&philosopherControl); //unbreakable piece of activity (stop)
        Sleep(min_time + rand()%(max_time-min_time)); //some delay
        printf("Philosopher[%i] thinking.\n", left_fork);
    }
    printf("Philosopher%i EXITING the program. \n", left_fork);
    return 0;
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    InitializeCriticalSection(&philosopherControl);
 
    for (int i = 0; i < phil_count; i++)
    {
        some[i] = CreateEvent(NULL, TRUE, FALSE, NULL); //FALSE - auto-reset, TRUE - intial state is singaled
        ResetEvent(some[i]);
    }
 
    for (int i = 0; i < phil_count; i++)
    {
        WaitForSingleObject(iteratorControl, INFINITE);
        ResetEvent(iteratorControl); //lock other threads to catch the right self number
        philosopher_number = i;
        Philosophers[i] = CreateThread(NULL, 0, philosopher, NULL, 0, NULL);
    }
 
    //int test1, test2, test3, test4, test5, test6;
    //test1 = WAIT_OBJECT_0;
    //test2 = WAIT_ABANDONED;
    //test3 = WAIT_TIMEOUT;
    //test4 = WAIT_FAILED;
 
    //SetEvent(some[0]);
    //test5 = WaitForSingleObject(some[0], 1);//after set = 0 = WAIT_OBJECT_0
    //WaitForSingleObject(some[0], INFINITE);//going through wait
    //test5 = WaitForSingleObject(some[0], 1);
 
    //ResetEvent(some[0]);
    //test5 = WaitForSingleObject(some[0], 1);//after reset = 258 = WAIT_TIMEOUT
    //WaitForSingleObject(some[0], 5000);//stuck on wait if infinite
    //test5 = WaitForSingleObject(some[0], 1);
 
    getch();
    return 0;
}
1
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.