Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
2 / 2 / 0
Регистрация: 05.12.2013
Сообщений: 271

Подскажите по потокам, не могу разобраться с producer/consumer

28.07.2018, 11:58. Показов 1858. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всех приветствую, подскажите , не могу понять как всетаки правильно имплементировать producer/consumer, подскажите по русски как нужно с ним обращаться,
вот сам он.
Нужно мне организовать потоки, чтобы каждый поток обрабатывал одну операцию параллельно с другим потоком.

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
public class ProducerConsumer<T> where T : class
{
    object mutex = new object();
    Queue<T> queue = new Queue<T>();
    bool isDead = false;
 
    public void Enqueue(T task)
    {
        if (task == null)
            throw new ArgumentNullException("task");
        lock (mutex)
        {
            if (isDead)
                throw new InvalidOperationException("Queue already stopped");
            queue.Enqueue(task);
            Monitor.Pulse(mutex);
        }
    }
 
    public T Dequeue()
    {
        lock (mutex)
        {
            while (queue.Count == 0 && !isDead)
                Monitor.Wait(mutex);
 
            if (queue.Count == 0)
                return null;
 
            return queue.Dequeue();
        }
    }
 
    public void Stop()
    {
        lock (mutex)
        {
            isDead = true;
            Monitor.PulseAll(mutex);
        }
    }
}
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
class Program
{
    static public void Main()
    {
        new Program().Run();
    }
 
    ProducerConsumer<string> q = new ProducerConsumer<string>();
 
    void Run()
    {
        var threads = new [] { new Thread(Consumer), new Thread(Consumer) };
        foreach (var t in threads)
            t.Start();
 
        string s;
        while ((s = Console.ReadLine()).Length != 0)
            q.Enqueue(s);
 
        q.Stop();
 
        foreach (var t in threads)
            t.Join();
    }
 
    void Consumer()
    {
        while (true)
        {
            string s = q.Dequeue();
            if (s == null)
                break;
            Console.WriteLine("Processing: {0}", s);
            Thread.Sleep(2000);
            Console.WriteLine("Processed: {0}", s);
        }
    }
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.07.2018, 11:58
Ответы с готовыми решениями:

Consumer-Producer на семафорах
Всем добрый день. Есть программа #include &lt;windows.h&gt; #include &lt;stdio.h&gt; #include &quot;iostream&quot; using namespace std; int Sklad = 0; ...

Классическая задача producer\consumer
Базовая задачка по потокам\семафорам. Поставщиц потребитель. Помогите вынести Buffer как отдельный класс. Чтобы он отвечал за переменную...

Синхронизация потоков через Event-ы (задача producer/consumer)
Задание :Реализуйте синхронизацию для простейшего случая задачи producer/consumer (spsc – single producer single consumer). Я уже...

4
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
28.07.2018, 12:45
Цитата Сообщение от Мдфв1234 Посмотреть сообщение
не могу понять как всетаки правильно имплементировать producer/consumer
Вам это для задания надо или для работы?
Если второе, то лучше используйте уже готовые реализации, например BlockingCollection.
0
2 / 2 / 0
Регистрация: 05.12.2013
Сообщений: 271
28.07.2018, 12:55  [ТС]
я знаю про dataflow, lockingCollection и тд, но мне нужен именно трешевый вариант , для себя, то есть без подключения всяких библиотек, хочу понять суть.

Добавлено через 7 минут
Есть у меня задача, я писал уже в некоторых темах про нее, надо мне по частям читать файл, складывать его в очередь, где хранятся блоки от файла и потом брать потоками эти блоки и обрабатывать их каждый блок параллельно, очередь ограниченная. По количеству потоков, я беру, количество ядер*2+еще 2 потока на чтение и добавление в очередь, и запись в готовый файл. Говорят мол используй продюсер, на словах я понимаю, что потоку поручаем задачу сжать например блок данных и поместить в очередь с готовым к записи материалом, в это время если очередь полная, то читающий поток ждет пока она, очередь с блоками не станет пустой, то есть пока потоки не разберут все блоки. И так как я новичек пока трудно инструментально, как сделать это все, Сама задача уже сделана но в однопточном варианте. Вот теперь хочу постигать потоки)
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
28.07.2018, 13:09
Цитата Сообщение от Мдфв1234 Посмотреть сообщение
мне нужен именно трешевый вариант , для себя, то есть без подключения всяких библиотек
BlockingCollection является частью .NET, начиная с верси 4.0.
Вы же свою реализацию List<T> не создаете, когда вам нужен динамический массив?

Ну а если по вашему коду, то какие именно вопросы возникают?
0
2 / 2 / 0
Регистрация: 05.12.2013
Сообщений: 271
28.07.2018, 13:28  [ТС]
использую .net 3.5, так было сказано в одном задании., А так я не совсем понимаю что происходит в коде, идеально в каждой строчке, и сам вопрос этот код я взял из примерна со стековерфлоу, и мне не ясно например если у меня есть метод, который что то делает, то куда я могу положить этот метод в этом коде
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.07.2018, 13:28
Помогаю со студенческими работами здесь

Подскажите пожалуйста, не могу разобраться
У меня есть форма отправки, в которой checkbox, при его отметке кнопка для отправки становится активной. я использовал этот скрипт: ...

Народ подскажите не могу разобраться
вот код программы class PassArray { static void vaTest(int v) { System.out.print(&quot;Количество аргументов: &quot; +v.length + ...

Не могу разобраться в преобразовании типов, подскажите...
import ua.sunbay.staff.HiperTest; import ua.sunbay.staff.Employee; import java.io.IOException; import java.io.PrintWriter; import...

Не могу разобраться с трактовкой требований, подскажите)
Есть письмо с требованиями к антивирусной защите, в нем есть пункт, который звучит так: &quot;Использование средств защиты от вирусов...

Ребят, подскажите, не могу разобраться, плохо ноут ловит Wi-Fi!
В общем, такая ситуация, ноутбук плохо принимает Wi-Fi, драйвера поменял ничего, а главное с телефона все шикарно с интернетом. Подскажите,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru