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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.05.2013, 17:11   #1
talim
 
Регистрация: 19.06.2011
Сообщений: 8
По умолчанию Задача "Производитель-Потребитель" на C#

Доброго времени суток.

Задание:
Цитата:
Разработать приложение на языке C#, в котором выполняется следующий алгоритм: два параллельных потока циклически выполняют вызов функций. Результаты работы каждый поток помещает в общую очередь конечной длины. Третий поток забирает из очереди результаты работы и отображает их на экране.
Очередь должна быть реализована с использованием двух объектов синхронизации "Семафор" (для потоков 1 и 2, и для потока 3). При заполнении очереди потоки 1 и 2 должны приостанавливаться функцией ожидания. При отсутствии результатов в очереди поток 3 также должен приостанавливаться функцией ожидания. Участок кода помещения результатов в очередь должен быть оформлен с использованием объекта синхронизации "Монитор".
И код который я написал:
Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
using System.Threading;

namespace ExempleSynsCostumerPoducer
{
    class MainClass
    {
        public Queue Qe = new Queue(20);
        static Semaphore s1 = new Semaphore(1, 2); 
        static Semaphore s2 = new Semaphore(1, 1); 
        Thread p1;
        Thread p2;
        Thread p3;

        public MainClass()       
        {
            Console.OutputEncoding = Encoding.GetEncoding(866); // Русский язык в консоли;
            p1 = new Thread(Producer);
            p2 = new Thread(Producer);
            p3 = new Thread(Consumer);
            p1.Start(0);                    
            p2.Start(1);                    
            p3.Start();
        }

        private void Producer(object i)    // Производитель
        {
            while (true)
            {
                s1.WaitOne();
                   Monitor.Enter(Qe);       // Используем Monitor
                    if (Qe.Count < 20)      // Если очередь не заполнена
                        Qe.Enqueue(i);      // Добавляем элемент
                    else
                        Thread.Sleep(1);    // На 1 мс приостанавливаем поток
                   Monitor.Exit(Qe);
                s1.Release();
            }
        }
        public void Consumer()              // Потребитель
        {
            while (true)
            {
                s2.WaitOne();
                if (Qe.Count < 1)           // Если отсутствуют результаты в очереди
                {
                    Thread.Sleep(1);        // На 1 мс приостанавливаем поток
                }
                else
                    Console.Write(Qe.Dequeue());   // Выводим "0" или "1" на экран
                s2.Release();
            }
        }

        static void Main()
        {
            new MainClass();
        }
    }
}
И собственно вопрос: правильно ли выполнено задание?
Если нет, то где и что нужно исправить?
talim вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создать класс "Фигура", от него наследованием создать 3 класса ("треугольник", "четырехугольник", "окружность") funnyy Помощь студентам 3 17.10.2012 17:40
Вывести название соответствующей карты вида "шестерка бубен", "дама червей","туз треф" и т.п. воваава Помощь студентам 3 01.12.2011 12:50
Производитель - потребитель Amsterdamus Помощь студентам 0 15.06.2010 08:41
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" aleksei78 Microsoft Office Excel 13 25.08.2009 12:04