Наличие Нити местный queue' s с прилавками

У меня есть четыре нити, у которого есть его собственная частная очередь и частное' международное количество ' участник, каждый раз, когда задача производится из нити программы, она должна быть поставлена в очередь очереди нити, у которой есть минимальное 'международное количество' среди нитей.

каждый раз, когда задача выдвинута в очередь, частное 'международное количество' должно быть увеличено на 1 каждый раз, когда задача высунута из очереди, частное 'международное количество' должно быть уменьшено на 1

таким образом 'международное количество' динамично изменяется относительно на толчок задач, поп-операция и нить программы отправят задачу очереди с самым низким, (или первый найденный ноль), количество.

Это - основная логика программы.

Я работаю на языке программирующего C++ в библиотеке мультипронизывания Linux, осуществляющей мультиуровень синхронная парадигма потока данных.

вы могли, пожалуйста, дать некоторые кодирующие идеи для implemenating эта логика. т.е. 1. Инициализация всей частной международной очереди возражает =0

2.counter ++, когда задача выдвинуты,

3.counter - когда задачи суются,

4. Задача disptacher видит частное международное количество каждой нити.

5. Задачи отправок стоять в очереди, у которого есть минимальное количество

1
nl ja de
Эта домашняя работа? Никакая проблема, если это, просто задавшись вопросом, в каком уровне детализации вы нуждаетесь?
добавлено автор Caribou, источник
просто рассмотрев ответ теперь - есть некоторая тонкость из-за того, что вы хотите сделать...
добавлено автор Caribou, источник
@Caribou мне нужны некоторые логики, как которые петли или функции должны использоваться, чтобы увеличить и уменьшить прилавок, когда некоторые задачи выдвигаются или суются в очереди
добавлено автор aram, источник
Больше исследования и информации необходимы для вопроса? пожалуйста, сообщите мне
добавлено автор aram, источник
да, я задам вопрос снова еще с некоторым исследованием.
добавлено автор aram, источник

1 ответы

у меня есть четыре нити, у которого есть его собственная частная очередь и private'int *посчитайте' участника, каждый раз, когда задача производится из нити программы, i*t должен быть поставлен в очередь очереди нити, у которой есть минимальное 'международное количество' *среди нитей.*

каждый раз, когда задача выдвинута в очередь, частное 'международное количество' *должен быть увеличен на 1 каждый раз, когда задача высунута из очереди, * частное 'международное количество' должно быть уменьшено на 1

Хорошо, таким образом В основном ваша нить программы - производитель, и у вас есть 4 потребительских нити. При помощи очереди в каждой нити вы будете минимизировать время, проведенное главной нитью, взаимодействующей с потребителями. N.B. необходимо рассмотреть, будут ли нити мореными/или переполнение - Т.Е. если единственный производитель создаст "работу" над уровнем, который гарантирует 4 потребителей, или если 4 потребителя будут затопляться.

naive approach So you need to synchronize the queue access/increment meaning that you need a mutex to stop the consumer accessing anything while the count and queue are modified. The easiest way is to do the synchronization would be to have a method (E.G. enqueue(Item& item) ) which locks the mutex within it.

C++11 : Mutex http://en.cppreference.com/w/cpp/thread/mutex

Дополнительно, если голодание будет проблемой (или переполнение), то необходимо будет использовать некоторую передачу сигналов, чтобы остановиться, соответствующая деятельность нитей (Оголодавший - останавливают потребителей, чтобы избежать использования центрального процессора, Переполнение - останавливают производителя, в то время как потребители нагоняют). Обычно эти сигналы осуществляются, используя условные переменные.

C++11 : Condition variables : http://en.cppreference.com/w/cpp/thread/condition_variable

так, 'международное количество' динамично изменяется относительно на задачи *толчок, поп-операция и нить программы отправят задачу t*o очередь с самым низким, (или первый найденный ноль), количество.

Таким образом, ситуация немного сложная здесь, в этом нити, которые вы хотите населить, будут теми с наименьшим количеством работы, чтобы сделать. Это требует, чтобы вы осмотрели 4 количество и выбрали очередь. , Однако, потому что есть только один производитель , можно, вероятно, просто просмотреть для очереди без захвата. Логика здесь - то, что потребители не будут затронуты прочитанным, и выбор нити действительно не был бы неправильным даже с потребителями, работающими во время того выбора.

Таким образом, у меня было бы множество объектов нити, у каждого из которых будут количество и mutex для захвата.

1. Инициализация всей частной международной очереди возражает =0

Инициализируйте количество в конструкторах - удостоверяются, что производитель не работает во время инициализации, и синхронизация не будет проблемой.

2.counter ++, когда задача выдвинуты, *3.counter - когда задачи суются, *

Осуществите 2 метода на объекте нити сделать enqueing/dequeuing и в каждом использовании lock_guard, чтобы захватить mutex (метод RAII). Тогда продвигайтесь/суйте пункт очереди и приращению/декременту как применимый.

C++11: lock_guard http://en.cppreference.com/w/cpp/thread/lock_guard

4. Задача disptacher видит частное международное количество каждой нити. *5. Задачи отправок стоять в очереди, у которого есть минимальное количество*

Как я сказал, выше того, если есть только один, можно просто просмотреть через множество объектов и выбрать (поддержите индекс к), объект нити, где прилавок (добавляют getCount() метод) является самым низким. Это, скорее всего, будет самым низким даже с потребителями, продолжающими их работу.

Если есть многократные нити, производящие работу тогда, вы, возможно, должны были бы думать о том, как вы хотите обращаться с 2 нитями enquing к той же самой нити (Это не могло бы иметь значения),

1
добавлено
да - просто помнят, что мое решение выше основано на единственном производителе и если вы увеличиваете то число you' ll должен думать о том, как они взаимодействуют - если оба выбирают ту же самую очередь, например.
добавлено автор Caribou, источник
ieeexplore.ieee.org/xpl/… это вид вещи вы делаете? (на той же самой приблизительной оценке?)
добавлено автор Caribou, источник
основная идея будет тем же самым, конечно в C++ 11 you' ll используют те же самые классы и требования. Нити обработки могут все еще быть проведены во множестве, но с многократными писателями можно получить утверждение/захват. Я сказал бы, строят его, тогда улучшают его. , НО это - очень сложная область, и кажется мне, что вы преуспели бы, чтобы найти главного программиста / лектор (?), который мог помочь вам определить то, что необходимо сделать определенно. It' s собирающийся быть вне меня, чтобы дать вам определенное решение, не исследуя область правильно (I' m жаль я can' t больше делают, чем я имею) -
добавлено автор Caribou, источник
@CaribouThank вы, Таким образом, полная идея была бы, Создаете множество нити ojects с конструктором, имеющим количество и mutex для захвата. правильный?
добавлено автор aram, источник
@CaribouThe новые рабочие места не производятся нитью программы (жаль я упомянул неправильно) каждый раз, когда я использую мультиуровень синхронная парадигма потока данных, рабочие места, производятся графами и узлами. Все рабочие места, произведенные из графов и узлов, должны искать минимальные местные очереди и поставить в очередь в нем. так там будет изменение в шагах implemenation, который вы объяснили выше, когда я использую рабочие места от графов и узлов вместо этого от нитей программы.
добавлено автор aram, источник
да это - вид, который я делаю. Мультиуровень синхронная парадигма потока данных
добавлено автор aram, источник
@Caribouplease не сожалеют, я получил общее представление теперь, как вы сказали, строят и затем улучшаются. Я сначала попытаюсь построить логический поток кода в основном, и я могу пойти, думают и делают IT-область specific.i надеется, что я могу попросить, чтобы вы сомневались, строя основной логический кодовый поток идеи.Thank you
добавлено автор aram, источник
pro.cxx
pro.cxx
3 049 участник(ов)

C/C++ chat 0. Простые вопросы, лабы и о IDE — в чат новичков @supapro 1. Не хамим, не переходим на личности, не вбрасываем утверждения без доказательств 2. No Ads, offtop, flood Объявления о вакансиях и евенты - в лс @AlexFails https://t.me/ProCxx/259155

Linux Help
Linux Help
2 686 участник(ов)

Правила: https://telegra.ph/Pravila-Linux-Help-10-15

supapro.cxx
supapro.cxx
1 925 участник(ов)

Чат для тех, кто немного знает C++, простые вопросы по реализации, синтаксису и ide – сюда, а для другого есть: /Главный чат по серьезным вопросам — @ProCxx /Чат по обсуждению всего — @fludpac

Linux Security
Linux Security
652 участник(ов)

Данная группа принципиально про безопасность и в частности про безопасность Linux. Прочие темы просим обсуждать в профильных чатах.

C++ Russia
C++ Russia
384 участник(ов)

Сообщество разработчиков C++ в Telegram.

cxx.Дискуссионная
cxx.Дискуссионная
298 участник(ов)

это не двач, общайтесь вежливо; разговор на почти любые темы; Не согласны с баном? В лс @AlexFails, @ivario

C++ для маленьких и тупых
C++ для маленьких и тупых
105 участник(ов)

Лоу левел (по среднему IQ участников) чатик ExtremeCode @extremecode Флудилка @extremecode_rest

Linux Gaming RUS
Linux Gaming RUS
28 участник(ов)

Русскоязычный чатик, посвящённый играм на различных дистрибутивах Linux, а также wine, proton Arch Linux RU @ArchLinuxChatRU Gnome RU @gnome_ru