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

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

18.01.2016, 18:22. Показов 4692. Ответов 8

Студворк — интернет-сервис помощи студентам
1 поток добавляет элементы в очередь. 2 дргуих должны счиать кждый элемент очереди. Как наилучшим образом организовать считываение элементов из очереди в 2-х поток, чтобы каждый (неизвестно, какой раньше) получил элемен и он был бы удалён.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.01.2016, 18:22
Ответы с готовыми решениями:

Доступ к очереди из разных потоков
Подскажите по многопоточности, у меня есть очередь (Queue) и мне надо организовать к ней доступ из разных потоков, выискал несколько...

Доступ к элементам управления (DGW, ListBox) из потоков
Под элементами управления имею в виду datgaridview, listbox и т.д. В общем подскажите в какую сторону "копать"?

С помощью сигналов организовать очередность записи двух потоков в файл.
Процесс 1 порождает потомка 2. Оба процесса открывают один и тот же файл и записывают в него в цикле по N байт. С помощью сигналов...

8
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
18.01.2016, 18:27
Цитата Сообщение от AlexGornostal Посмотреть сообщение
Как наилучшим образом организовать считываение элементов из очереди в 2-х поток
Блокировать очередь при обращении к ней каждого из потоков. И ввести флаг, для проверки того, считан ли этот элемент другим потоком.
0
0 / 0 / 0
Регистрация: 16.05.2015
Сообщений: 8
18.01.2016, 18:37  [ТС]
То есть нужно создать очередь флагов?
0
0 / 0 / 1
Регистрация: 10.12.2014
Сообщений: 36
18.01.2016, 18:45
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

1. создаём публичную очередь.
2. создаём мьютекс, для блокировки очереди во время работы с ней.
3. работаем с очередью и незабываем ставить мьютекс
4. желательно очередь и мьютекс создавать в одном классе.
C#
1
2
3
4
5
6
7
8
static public Queue<string> qu_mes_from_lockers = new Queue<string>(); //публичная очередь (вне main)
 
static public Mutex mtx = new Mutex(); //мьютекс, там же, (вне main)
 
//работаем с очередью
mtx.WaitOne();
string messageINarray = qu_mes_from_lockers.Dequeue();  //такие же конструкции добавить при записи и считывании
mtx.ReleaseMutex();
0
0 / 0 / 0
Регистрация: 16.05.2015
Сообщений: 8
18.01.2016, 18:59  [ТС]
Но таким образом мы сможем только 1 раз (только в одном потоке) обработать записанный в очередь элемент.
У меня 3 потока: 1 записывает в очередь, а 2 других должны по своему обработать каждый элемент. Проблема в том, чтобы оба эти потока получили элемент, а когда оба его получат (неизвестно, какой сделает это первым) удалить его. То есть в одном случае удаление происходит после обработки потоком 2, в другом - потком 3.
0
0 / 0 / 1
Регистрация: 10.12.2014
Сообщений: 36
18.01.2016, 19:28
И создать две очереди не получится? Как на счёт писать в обе очереди одно и тоже и обработавовать их потом каждую в своём потоке.
Это конечно не очень рационально, но для наброска угодно.
Ведь я понимаю, что нет возможности сразу разделять записи которые валяться в одну очередь?
0
0 / 0 / 0
Регистрация: 16.05.2015
Сообщений: 8
18.01.2016, 19:32  [ТС]
Разделить при добавлении нельзя, так как все элементы должны быть обработаны обоими потоками (каждый работает с ними по-своему). По поводу двух очередей: я с самого начала так сделал, но по заданию должна быть одна очередь (не обязательно, кстати, очередь, но разницы никакой нет).
0
0 / 0 / 1
Регистрация: 10.12.2014
Сообщений: 36
18.01.2016, 19:39
Ну так добавте еще одну очередь и пишите в обе очереди из потока 1.
Второй поток будет обрабатывать очередь 1
Третий поток будет обрабатывать очередь 2
Или сделайте что бы из втрого потока стартовал третий. И в него пепедавайте уже то что считал второй поток.
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
18.01.2016, 19:47
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

AlexGornostal, примерно так, я особо не проверял, но принцип там понятен, я думаю.
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
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);
            }
        }
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.01.2016, 19:47
Помогаю со студенческими работами здесь

Одновременный доступ к коллекции из двух потоков
Здравствуйте. В программе открываю UDP-сокет, в который приходят данные с устройства. Вкратце, у меня выглядит это так: public void...

Доступ к экземпляру класса из двух потоков
Доброго времени суток! Есть вопрос: как реализовать возможность одновременного доступа из двух backgroundworker'ов к полям экземпляра...

Нужно ли синхронизировать доступ к переменной из двух потоков?
Допустим есть два потока: основной и вторичный. 1. И допустим есть глобальная переменная bool b; Вопрос: является ли b...

Доступ к одному методу из двух потоков, критические секции
Вопрос такой: имеется объект MyObject класса TExample, содержащего метод DrawSomething(Cnv: TCanvas). Сей метод используется в обработчиках...

Создать стек из номеров записи. Организовать прямой доступ к элементам записи. (цілі, дійсні, комплексні)
Создать стек из номеров записи. Организовать прямой доступ к элементам записи. (цілі, дійсні, комплексні). организовать фильтацию записей...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru