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

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

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

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

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

textual
Листинг программы
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
using System.Threading;
 
namespace Queue_Test {
    class Program {
        static Queue<int> objQueue = new Queue<int>();
        static object locker = new object();
        static Random r = new Random();
 
        static void Main(string[] args) {
            Thread addThread = new Thread(AddItems);
            Thread GetThread_1 = new Thread(DeueueAndDeleteItem);
            Thread GetThread_2 = new Thread(DeueueAndDeleteItem);
            addThread.Start();
            GetThread_1.Start();
            GetThread_2.Start();
            Console.ReadLine();
        }
        static void DeueueAndDeleteItem() {
            bool needTodelete = false;
            while (objQueue.Count!=0) {
                lock (locker) {
                    int item = 0;
                    if (needTodelete) {
                        item = objQueue.Dequeue();
                        needTodelete = false;
                        Console.WriteLine("Item {0} dequeued", item);
                    }
                    else {
                        item = objQueue.Peek();
                        needTodelete = true;
                        Console.WriteLine("Item {0} peeked!", item);
                    }
                    
                }
                Thread.Sleep(200);
            }
        }
        static void AddItems() {
            while (true) {
                int item = r.Next(0, 101);
                lock (locker) {
                    objQueue.Enqueue(item);
                }
                Thread.Sleep(50);
                Console.WriteLine("Item {0} enqueued!", item);
            }
        }
    }
}

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


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

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

15   голосов , оценка 3.8 из 5
Похожие ответы