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

Потоки. 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, 13:03  [ТС]
Вобщем, вот более-менее рабочий код. Так и не понял, почему не получилось сделать кусок кода внутри одного потока, который не может быть прерван другим потоком, хотя в описании критических секций вроде бы говорилось, что она может лочится и разлочится только внутри одного потока.. а в результате выполнения четко видно, что другие потоки всё равно разлочивают её. А ещё не помог тип константы, всё равно нумерация почему-то изменяется, хотя казалось бы потоки разные, между собой не имеют ничего общего, не являются одним обьектом..

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
// 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, FALSE, NULL);//manual reset, init non-signaled
int philosopher_number = 0;
 
//event for unbreakable part of philopher activity
CRITICAL_SECTION philosopherControl;
//HANDLE philosopherControl = CreateEvent(NULL, TRUE, FALSE, 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;
    ResetEvent(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)
        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");
            //occupy forks
            SetEvent(some[left_fork]);
            SetEvent(some[right_fork]);
            printf("Eating.");
            LeaveCriticalSection(&philosopherControl); //unbreakable piece of activity (stop)
            Sleep(min_time + rand()%(max_time-min_time)); //some delay
            //unoccupy forks
            ResetEvent(some[left_fork]);
            ResetEvent(some[right_fork]);
        }
        else 
        { 
            printf("failed.\n"); 
            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[])
{
    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++)
    {
        SetEvent(iteratorControl); //lock other threads to catch the right self number
        philosopher_number = i;
        Philosophers[i] = CreateThread(NULL, 0, philosopher, NULL, 0, NULL);
    }
 
    getch();
    return 0;
}
Добавлено через 1 минуту
Цитата Сообщение от kravam Посмотреть сообщение
Хм. Интересно, а как предполагается тестировать задачу? То есть я так предполагаю, в консоли всё это дело будет выводиться?
Консоль, сообщения вроде "философ хочет есть. пытается взять вилки - удача\неудача." задержка "философ думает" задержка... и так несколько циклов для каждого из философов
0
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru