Форум программистов, компьютерный форум 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? подробнее

Показать сообщение отдельно
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
11.03.2014, 02:10     Задача о философах с использованием событий
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 <cstdlib>
#include <cstdio>
 
#define min 100
#define max 500
#define step 4
 
struct ThreadArgs {
   int philosopherNum;
   HANDLE forks[ 2 ];
};
 
DWORD philosopherAction( LPVOID arg );
 
int main() {
   const unsigned int PHILOSOPHERS_NUM = 5;
   
   HANDLE forks[ PHILOSOPHERS_NUM ] = {};
   HANDLE philosophers[ PHILOSOPHERS_NUM ] = {};
   
   ThreadArgs args;
   
   for ( unsigned int i = 0; i < PHILOSOPHERS_NUM; i++ ) {
      forks[ i ] = CreateEvent( 0, true, false, NULL ); //тип сброса- ручной
   }
   
   for ( unsigned int i = 0; i < PHILOSOPHERS_NUM; i++) {
      args.philosopherNum = i;
      args.forks[ 0 ] = forks[ i ];
      
      if ( i < 4 )
         args.forks[ 1 ] = forks[ i + 1 ];
      else
         args.forks[ 1 ] = forks[ 0 ];
      
      philosophers[ i ] = CreateThread( NULL, 0, philosopherAction, &args, 0, NULL );
   }
   
   WaitForMultipleObjects( PHILOSOPHERS_NUM, philosophers, true, INFINITE );
   
   return 0;
}
 
DWORD philosopherAction( LPVOID arg ) {
   ThreadArgs *args = static_cast< ThreadArgs * >( arg );
 
    for(int i = 0; i < step; i++) {          //повторяет 4 раза
        Sleep( min + rand() % ( max-min ));  //задержка
        printf( "Philosopher[ %i ] want to eat.\n", args->philosopherNum );
        printf( "Try to cath forks.\n");
        printf( "Left[%i] and right[%i] forks - ", args->philosopherNum, args->philosopherNum + 1 );
        
        if ( WaitForMultipleObjects( 2, args->forks, true, 1 ) != WAIT_OBJECT_0 ) {
            printf("success.\n");
            SetEvent( args->forks[ 0 ] );  //объект "событие" в сигнальное состояние
            SetEvent( args->forks[ 1 ] );  //объект "событие" в сигнальное состояние
            printf( "Eating." );           //философ ест
            Sleep( min + rand() % ( max - min ));
            ResetEvent( args->forks[ 0 ] );   //сброс события
            ResetEvent( args->forks[ 1 ] );   //сброс события
        }
        
        Sleep( min + rand() % ( max-min ));
        
        printf("Philosopher[%i] THINKING.\n", args->philosopherNum ); //философ думает
    }
    
    return 0;
}
Попытался хоть что то оставить от предыдущего примера. Сразу говорю - в выводе будет каша, так как одновременно будут писать все потоки.

Добавлено через 1 минуту
NNN7, да, вы правильно все поняли. Только вот в примере каша, прототип функции не соответствует ожидаемому в качестве параметра.

Добавлено через 4 минуты
WaitForMultipleObjects( PHILOSOPHERS_NUM, philosophers, true, INFINITE ); нужен для того, что бы основной поток дождался завершения всех дочерних потоков.
Первым параметром идет количество объектов в массиве, вторым идет указатель на массив объектов, третьим - флаг - ждать ли сигнала от всех объектов ( true ) или хватит одного сигнала ( false ). Ну и последним - количество миллисекунд для ожидания.

Вот, кстати, очень хорошая статья о многопоточности в целом, и о ней же в Windows в частности http://www.kurzenkov.com/articles/multithreading1.html
 
Текущее время: 19:59. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru