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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.05.2012, 00:07   #1
opax
 
Регистрация: 07.12.2010
Сообщений: 3
По умолчанию Задача о курильщиках!

Помогите накидать на с\с++ с использованием потоков и семафоров (Linux)

Задача о курильщиках

Есть три процесса-курильщика и один процесс-посредник.
Курильщик непрерывно скручивает сигареты и курит их.
Чтобы скрутить сигарету, нужны табак, бумага и спички. У одного процесса-курильщика есть табак, у второго – бумага, а у третьего – спички. Посредник кладет на стол по два разных случайных компонента. Тот процесс-курильщик, у которого есть третий компонент, забирает компоненты со стола, скручивает сигарету и курит. Посредник дожидается, пока курильщик закончит, затем процесс повторяется. Создать многопоточное приложение, моделирующее поведение курильщиков и посредника.
При решении задачи использовать семафоры.

Имеется 4 процесса, они могут быть разделены на 2 группы: курильщики и маклер(помощник). Чтобы курить, курильщикам нужно 3 ресурса: табак, бумага и спички. У одного курильщика только один ресурс. У маклера есть все 3 ресурса. В один момент времени он выставляет на рынок 2 ресурса. Как организовать взаимодействие без возможных дедлоков.
Маклер выкидывает 2 товара, возбуждаются переходы ts (ждет, хватает ресурсы), tq (курит), tl(готовит сигареты)


Вот подобная программа, возможно можно переписать:


Задача о кольцевом буфере.
Потоки производители и потребители разделяют кольцевой буфер, состоящий из 100 ячеек. Производители передают со-
общение потребителям, помещая его в конец очереди буфера. Потребители сообщение извлекают из начала очереди буфера. Создать многопоточное приложение с потоками писателями и читателями. Предотвратить такие ситуации как, изъятие сообщения из пустой очереди или помещение сообщения в полный буфер. При решении задачи использовать семафоры.

Обсуждение.
Пусть для определенности буфер – это целочисленный массив из 100 элементов. Задача обладает двумя критическими секциями.
Первая критическая секция связана с операциями чтения-записи нескольких потоков в общий буфер. Вторая критическая секция определяется тем, что буфер являются конечным, запись должна производиться только в те ячейки, которые являются свободными или уже прочитаны потоками-читателями(условная взаимная синхронизация).
Для защиты первой критической секции воспользуемся двумя двоичными семафорами (мьютексами). Один двоичный семафор сделает возможным запись в буфер только для одного потока-писателя. Второй двоичныйсемафор сделает возможным чтение из буфера только для одного потока-читателя. Операция чтения должна быть защищена, потому что она являетсяи операцией записи тоже, так как поток, прочитавший ячейку буфера, обязанее как-то пометить. Иначе через определенное время выполнения программы, операция записи может стать невозможной или некорректной, в силу того, что буфер конечен. Операции чтения и записи могут проходить параллельно, так как всегда происходят в разных ячейках.
Для условной синхронизации воспользуемся двумя семафорами. Значение первого семафора показывает, сколько ячеек в буфере свободно. Ячейка свободна, когда в нее еще не осуществлялась запись или ячейка была прочитана. Значение второго семафора показывает, сколько ячеек в буфере занято. Естественно, операция записи не может быть выполнена, пока количество занятых ячеек равно 100 (или количество свободных ячеек равно 0), и операция чтения не может быть выполнена, пока количество свободных ячеек равно 100 (или количество занятых ячеек равно 0). Для блокировки потока воспользуемся условиями, заключенными в скобки, исходя из особенностей поведения семафоров.

Последний раз редактировалось opax; 14.05.2012 в 00:29.
opax вне форума Ответить с цитированием
Старый 14.05.2012, 00:08   #2
opax
 
Регистрация: 07.12.2010
Сообщений: 3
По умолчанию Задача о кольцевом буфере.

Код:
#include <pthread.h> 
#include <semaphore.h> 
#include <stdlib.h> 
#include <stdio.h> 
int buf[100] ; //буфер
int front = 0 ; //индекс для чтения из буфера
int rear = 0 ; //индекс для записи в буфер
sem_t  empty ; //семафор, отображающий насколько  буфер пуст
sem_t  full ; //семафор, отображающий насколько полон буфер
pthread_mutex_t mutexD ; //мутекс для операции записи
pthread_mutex_t mutexF ; //мутекс для операции чтения
//стартовая функция потоков – производителей(писателей) 
void *Producer(void *param) 
{  
 int data, i ; 
 while (1) 
 { 
    //создать элемент для буфера
  for (i=0,data=0 ; i<100 ; i++) 
   data += rand()/(RAND_MAX/10) – 5 ; 
  //поместить элемент в буфер
    pthread_mutex_lock(&mutexD) ; //защита операции записи
  sem_wait(&empty) ; //количество свободных ячеек уменьшить на единицу
  buf[rear] = data ; rear = (rear+1)%100 ; //критическая секция
    sem_post(&full) ; //количество занятых ячеек увеличилось на единицу
  pthread_mutex_unlock(&mutexD) ;    
 } 
} 
//стартовая функция потоков – потребителей(читателей) 
void *Consumer(void *param) 
{  
 int result ; 
 while (1) 
 { 
    //извлечь элемент из буфера
  pthread_mutex_lock(&mutexF) ; //защита операции чтения
  sem_wait(&full) ; //количество занятых ячеек уменьшить на единицу
  result = buf[front] ; front = (front+1)%100 ; //критическая секция
    sem_post(&empty) ; //количество свободных ячеек увеличилось на единицу
  pthread_mutex_unlock(&mutexF) ; 
  //обработать полученный элемент  
  fprintf(stdout,” - %d -”,result) ; 
 } 
} 
int main() 
{  
 int i ; 29
 //инициализация мутексов и семафоров
 pthread_mutex_init(&mutexD, NULL) ;  
 pthread_mutex_init(&mutexF, NULL) ;  
 sem_init(&empty, 0, 100) ; //количество свободных ячеек равно 100 
 sem_init(&full, 0, 0) ; //количество занятых ячеек равно 0
 //запуск производителей
 pthread_t threadP[3] ; 
 for (i=0 ; i<3 ; i++) 
  pthread_create(&threadP[i],NULL,Producer,NULL) ; 
 //запуск потребителей
 pthread_t threadC[4] ; 
 for (i=0 ; i<4 ; i++) 
  pthread_create(&threadC[i],NULL,Consumer,NULL) ; 
 //пусть главный поток будет потребителем
 Consumer(NULL) ;  
}
opax вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
задача на структуру(struct)/задача на работу с файлом SevenArth Помощь студентам 0 26.04.2012 19:06
Задача о стрелках (задача Майхелла) Silly Student Помощь студентам 0 14.12.2011 22:20
Задача на оптимальный расчет маршрута (задача в презентации) в табличном процессоре Excel Toofed Помощь студентам 0 30.11.2011 01:12
Задача минимизации дисбаланса на линии сборки (задача минимакса) LenZab Microsoft Office Excel 13 13.03.2011 22:51