Наличие локальной очереди потоков со счетчиками

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

всякий раз, когда задача помещается в очередь, частное ‘int count’ должно увеличиваться на 1
всякий раз, когда задача выходит из очереди, частное ‘int count’ должно быть уменьшено на 1

Таким образом, ‘int count’ динамически меняется в зависимости от задач push, pop pop и Поток программы отправит задачу в очередь с самым низким (или первым найденным нулем) счетчиком.

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

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

Не могли бы вы дать некоторые идеи кодирования для реализации этой логики. то есть.
1. Инициализация всех частных счетчиков внутренней очереди = 0

2.counter ++, когда задача выдвигается,

3.counter— когда задачи поставлены,

4. Диспетчер задач видит частное число int каждого потока.

5. Отправляет задачи в очередь с минимальным количеством

1

Решение

У меня есть четыре потока, которые имеют свою собственную очередь и private’int
* count ‘member, всякий раз, когда задача создается из потока программы, я * t
должен быть поставлен в очередь в поток потока, который имеет минимальное число int
* среди тем. *

всякий раз, когда задача помещается в очередь, частное ‘int count’
* должен быть увеличен на 1 всякий раз, когда задача выпадает из очереди, *
частное ‘int count’ должно быть уменьшено на 1

Итак В принципе ваша ветка программы является производителем, и у вас есть 4 пользовательских ветки. Используя очередь в каждом потоке, вы минимизируете время, затрачиваемое основным потоком на взаимодействие с потребителями. Нотабене Вы должны решить, будут ли ваши потоки истощены / или переполнены — I.E. если один производитель создаст «работу» со скоростью, которая гарантирует 4 потребителя, или если 4 потребителя будут завалены.

наивный подход
Таким образом, вам нужно синхронизировать доступ / приращение очереди, что означает, что вам нужно mutex чтобы запретить потребителю доступ к чему-либо, пока count а также queue модифицированы. Самый простой способ сделать синхронизацию — это иметь метод (Е.Г. enqueue(Item& item) ) который блокирует mutex внутри.

C ++ 11: мьютекс http://en.cppreference.com/w/cpp/thread/mutex

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

C ++ 11: переменные условия: http://en.cppreference.com/w/cpp/thread/condition_variable

Таким образом, ‘int count’ динамически меняется относительно задач
* push, pop операция и поток программы отправит задачу t * o
очередь с наименьшим (или первым найденным нулем) счетчиком.

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

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

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

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

2.counter ++, когда задача выдвигается,
* 3.counter— когда задачи поставлены, *

Реализуйте 2 метода на объекте потока, чтобы выполнить заворачивание / снятие очереди, и в каждом используйте lock_guard для блокировки мьютекса (техника RAII). Затем нажмите / вытолкните элемент в / из очереди и, при необходимости, увеличьте / уменьшите.

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

4. Диспетчер задач видит частное число int каждого потока.
* 5.Отправляет задачи в очередь с минимальным количеством *

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

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]