Организовать доступ к элементам очереди из двух потоков - C#

Узнай цену своей работы

Формулировка задачи:

1 поток добавляет элементы в очередь. 2 дргуих должны счиать кждый элемент очереди. Как наилучшим образом организовать считываение элементов из очереди в 2-х поток, чтобы каждый (неизвестно, какой раньше) получил элемен и он был бы удалён.

Решение задачи: «Организовать доступ к элементам очереди из двух потоков»

textual
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5.  
  6. using System.Threading;
  7.  
  8. namespace Queue_Test {
  9.     class Program {
  10.         static Queue<int> objQueue = new Queue<int>();
  11.         static object locker = new object();
  12.         static Random r = new Random();
  13.  
  14.         static void Main(string[] args) {
  15.             Thread addThread = new Thread(AddItems);
  16.             Thread GetThread_1 = new Thread(DeueueAndDeleteItem);
  17.             Thread GetThread_2 = new Thread(DeueueAndDeleteItem);
  18.             addThread.Start();
  19.             GetThread_1.Start();
  20.             GetThread_2.Start();
  21.             Console.ReadLine();
  22.         }
  23.         static void DeueueAndDeleteItem() {
  24.             bool needTodelete = false;
  25.             while (objQueue.Count!=0) {
  26.                 lock (locker) {
  27.                     int item = 0;
  28.                     if (needTodelete) {
  29.                         item = objQueue.Dequeue();
  30.                         needTodelete = false;
  31.                         Console.WriteLine("Item {0} dequeued", item);
  32.                     }
  33.                     else {
  34.                         item = objQueue.Peek();
  35.                         needTodelete = true;
  36.                         Console.WriteLine("Item {0} peeked!", item);
  37.                     }
  38.                    
  39.                 }
  40.                 Thread.Sleep(200);
  41.             }
  42.         }
  43.         static void AddItems() {
  44.             while (true) {
  45.                 int item = r.Next(0, 101);
  46.                 lock (locker) {
  47.                     objQueue.Enqueue(item);
  48.                 }
  49.                 Thread.Sleep(50);
  50.                 Console.WriteLine("Item {0} enqueued!", item);
  51.             }
  52.         }
  53.     }
  54. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 3.8 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы