Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
29 / 29 / 5
Регистрация: 21.04.2012
Сообщений: 282
1

Очередь с приоритетом сделать многопоточной

22.05.2015, 15:16. Просмотров 1172. Ответов 2
Метки нет (Все метки)

Добрый день. Есть реализованная очередь с приоритетом. Реализованы операции вставки, извлечения и изменения приоритета. Теперь встала задача, чтобы сделать эту очередь многопоточной. Один поток должен создать очередь, добавлять туда элементы и изменять приоритет. Второй поток должен извлекать элементы. В потоках вообще полный ноль. Подскажите пожалуйста как это сделать. Если можно, на небольшом примере.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.05.2015, 15:16
Ответы с готовыми решениями:

Очередь с приоритетом
Доброй ночи! Как создать очередь с приоритетом? Объясните пожалуйста. И еще один вопросик:...

Очередь с приоритетом
Всем привет, есть задание (на картинке) Из него сделал все, но не пойму что требуется в последнем...

Сделать очередь с приоритетом, которая бы работала с классом Message<TPriority, TContent>
Добрый день. Пытаюсь вот понять одну штуку. У меня есть некий класс - сообщение: public class...

Очередь с приоритетом. Элементы с наивысшим приоритетом ставятся в начало очереди, с наименьшим – в конец
Здравствуйте! имеется задание: создать очередь с приоритетом (у каждого элемента свой приоритет)....

2
310 / 271 / 109
Регистрация: 27.09.2010
Сообщений: 1,058
22.05.2015, 17:54 2
Лучший ответ Сообщение было отмечено Rabbit13245 как решение

Решение

Вот вам накидал небольшой пример:
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
class Module1
{
    public static void Main()
    {
        AddQueue newQueue=new AddQueue();
        Thread th1=new Thread(newQueue.AddElement);
        th1.Start();
 
        ReadQueue readQueue=new ReadQueue();
        Thread th2=new Thread(readQueue.ReadElement);
        th2.Start();
 
    }
}
 
public class Synhronize
{
    public static List<int> lst=new List<int>();
    public static bool FlagFinishThread = false;
    public static Mutex mut = new Mutex();
}
 
class AddQueue
{
    public void AddElement()
    {
        Random rm=new Random();
        for (int i = 0; i < 10; i++)
        {
            Synhronize.mut.WaitOne();//ждем мьютекс   
         
            int element = rm.Next(100);
            Synhronize.lst.Add(element);//добавляем в очередь элемент
            Console.WriteLine("Поток поставил в очередь число {0}. В очереди {1} чисел", element, Synhronize.lst.Count);
 
            Synhronize.mut.ReleaseMutex();//освобождаем мьютекс
        }
        Synhronize.FlagFinishThread = true;//взводим флаг для завершения потока чтения очереди
        Console.WriteLine("Поток с добавлением элементов завершил работу");
    }
}
 
class ReadQueue
{
    public void ReadElement()
    {
        while (!Synhronize.FlagFinishThread | Synhronize.lst.Count>0)//читаем очередь, пока не взведен флаг или есть элементы в очереди
        {
            if (Synhronize.lst.Count > 0)
            {
                Synhronize.mut.WaitOne();//ждем мьютекс
 
                int element = Synhronize.lst[0];
                Synhronize.lst.RemoveAt(0);//удаляем элемент из очереди
                Console.WriteLine("Поток прочитал число {0} и удалил его из очереди. В очереди {1} чисел", element, Synhronize.lst.Count);
 
                Synhronize.mut.ReleaseMutex();//освобождаем мьютекс
            }
        }
 
        Console.WriteLine("Поток с чтением элементов завершил работу");
    }
}
0
29 / 29 / 5
Регистрация: 21.04.2012
Сообщений: 282
24.05.2015, 13:50  [ТС] 3
titans2011, я понял. через 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
//сам список
class PriorityList<TItem>
{
   public void Add(int priority, TItem item){//добавление}
   public TItem Get(){//достать самый верхний и удалить}
   public void ChPriority(int oldPriority, TItem, int newPriority){//изменение приоритета}
}
//управляющий класс
public class Manager<TItem>
{
   PriorityList<TItem> list = new PriorityList<TItem>();
   private object locker = new object();
   public void Add(TItem item)
   {
      lock(locker)
      {
         list.Add(item);
      }
   }
 
   public Titem Get()
   {
      Task<TItem> task1 = new Task<TItem>(()=>GetTask());
      task1.Start();
      return task1.Result;
   }
   private TItem GetTask()
   {
      lock(locker)
      {
         list.Get();
      }
   }
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.05.2015, 13:50

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Очередь с приоритетом
как реализовать очередь с приоритетом на бинарной куче?при том нужно графически вывести на консоль...

Очередь с приоритетом
У меня есть задание: 9. Разработать шаблон класса для работы с очередью с приоритетами,...

Очередь с приоритетом
есть очередь #include &lt;iostream&gt; #include &lt;queue&gt; using namespace std; int main() { ...

Очередь с приоритетом
Всем привет . Собственно нужно организовать очередь с приоритетом. Задание: В офисе один...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.