Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.12.2022, 08:19   #1
кирилл345
Новичок
Джуниор
 
Регистрация: 31.10.2022
Сообщений: 2
Сообщение критическая секция в си

помогите найти критическую секцию в данном коде
Код:
#include <pthread.h>
#include <stdlib.h>
#include <stdio.h>
 
#include <conio.h>
#include <Windows.h>
 
#define PHT_SIZE 5
 
typedef struct philosopher_tag {
    const char* name;
    unsigned left_fork;
    unsigned right_fork;
} philosopher_t;
 
typedef struct table_tag {
    pthread_mutex_t forks[PHT_SIZE];
} table_t;
 
typedef struct philosopher_args_tag {
    philosopher_t* philosopher;
    table_t* table;
} philosopher_args_t;
 
pthread_mutex_t entry_point = PTHREAD_MUTEX_INITIALIZER;
 
void init_philosopher(philosopher_t* philosopher,
                      const char* name,
                      unsigned left_fork,
                      unsigned right_fork) {
    philosopher->name = name;
    philosopher->left_fork = left_fork;
    philosopher->right_fork = right_fork;
}
 
void init_table(table_t* table) {
    size_t i;
    for (i = 0; i < PHT_SIZE; i++) {
        pthread_mutex_init(&table->forks[i], NULL);
    }
}
 
void* eat(void* args) {
    philosopher_args_t* arg = (philosopher_args_t*)args;
    
    philosopher_t* philosopher = arg->philosopher;
    table_t* table = arg->table;
    unsigned random;
 
    do {
        printf("%s started dinner\n", philosopher->name);
 
        pthread_mutex_lock(&entry_point);
        pthread_mutex_lock(&table->forks[philosopher->left_fork]);
        random = rand() % 1000;
        Sleep(random);
        pthread_mutex_lock(&table->forks[philosopher->right_fork]);
        pthread_mutex_unlock(&entry_point);
 
        printf("%s is eating after %d ms sleep\n", philosopher->name, random);
 
        pthread_mutex_unlock(&table->forks[philosopher->right_fork]);
        pthread_mutex_unlock(&table->forks[philosopher->left_fork]);
 
        printf("%s finished dinner\n", philosopher->name);
    } while (1);
}
 
void main() {
    pthread_t threads[PHT_SIZE];
 
    philosopher_t philosophers[PHT_SIZE];
    philosopher_args_t arguments[PHT_SIZE];
    table_t table;
 
    size_t i;
 
    init_table(&table);
 
    init_philosopher(&philosophers[0], "sacha", 0, 1);
    init_philosopher(&philosophers[1], "alexey", 1, 2);
    init_philosopher(&philosophers[2], "evgeni", 2, 3);
    init_philosopher(&philosophers[3], "Denis", 3, 4);
    init_philosopher(&philosophers[4], "vlad", 4, 0);
 
    for (i = 0; i < PHT_SIZE; i++) {
        arguments[i].philosopher = &philosophers[i];
        arguments[i].table = &table;
    }
 
    for (i = 0; i < PHT_SIZE; i++) {
        pthread_create(&threads[i], NULL, eat, &arguments[i]);
    }
 
    for (i = 0; i < PHT_SIZE; i++) {
        pthread_join(threads[i], NULL);
    }
 
    _getch();
}
кирилл345 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Критическая секция в РБД Winexcel SQL, базы данных 7 07.06.2014 16:30
Потоки, Критическая секция, виснет форма. Sonny01 Помощь студентам 3 14.10.2012 18:26
секция resource goluzov Win Api 0 04.08.2012 09:16
Критическая секция между потоками на разных ядрах 3D Hunter Win Api 11 26.02.2012 08:06