Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/18: Рейтинг темы: голосов - 18, средняя оценка - 4.78
 Аватар для vab9petryk
2 / 2 / 1
Регистрация: 28.09.2013
Сообщений: 255

Два потока, две очереди, два потока

21.03.2016, 17:36. Показов 3621. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть две очереди. Каждая из них заполняется своим потоком. Есть два потока, которые достают данные из своей очереди. Но когда одна из очередей становится больше заданного размера n, то есть поток достающий данные из этой очереди не справляется, на помощь должен придти достающий поток соседней очереди, но только при условии, что у него со своей очередью все хорошо.
Мне не понятно, как сообщить соседнему достающему потоку, что:"вот мол, помоги мне, я не справляюсь со своей очередью".
Пока что есть только потокобезопасная очередь.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.03.2016, 17:36
Ответы с готовыми решениями:

Два потока winapi
Ребят ребят,два потока нужно сделать в проге,вот хотел узнать,это только через WINAPI можно сделать? Нет ли какого нибудь ещё хитрого и...

Два потока и один объект
Всем привет. Пишу игру с физическим движком box2d и возникла проблема , которая в принципе к box2d относится только косвенно, поэтому не...

Сделать в приложении два потока
#include "stdafx.h" #include "conio.h" #include "iostream" #include "time.h" #include "cstring" #include <windows.h> #include...

4
44 / 44 / 19
Регистрация: 04.05.2014
Сообщений: 190
21.03.2016, 22:28
Лучший ответ Сообщение было отмечено vab9petryk как решение

Решение

А сообщать не надо. Просто поток должен смотреть на состояние и своей очереди, и соседней. Если своя почти пустая, то заняться соседней. Очередь потокобезопасна, поэтому всё будет хорошо.
0
 Аватар для vab9petryk
2 / 2 / 1
Регистрация: 28.09.2013
Сообщений: 255
22.03.2016, 00:37  [ТС]
Цитата Сообщение от cordfield Посмотреть сообщение
заняться соседней
заняться соседней нужно когда там проблемы(когда длинная очередь), а не когда своя очередь пуста.
Сделал в принципе так. Работает. Но вопрос, как теперь остановить потоки потребители? Потоки производители то остановились сами собой, когда добавили n-ое количество элементов. А потоки потребители?
Наверное самым оптимальным решением будет завести в очереди флаг. Когда производители завершат добавлять элементы, изменить значение флага, и потребители будут знать, что новых элементов не будет. Им останется только обработать оставшиеся элементы.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
22.03.2016, 00:55
Цитата Сообщение от vab9petryk Посмотреть сообщение
Мне не понятно, как сообщить соседнему достающему потоку, что:"вот мол, помоги мне, я не справляюсь со своей очередью".
есть тред-пул.
он держит открытыми, но спящими несколько штук потоков
(по количеству ядер процессора обычно).

клиент грузит пул задачами.
может быть 1 штуку,
может быть сразу 1000 штук.

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

поток копирует к себе кучку задач.
если их слишком много: делает сигнал, что приводит к пробуждению ещё одного потока.

ещё один поток копирует к себе кучку задач.
если их слишком много: делает сигнал... (ну вы поняли).

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

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

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

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

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

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

поэтому, пока в очереди есть хотя бы одна задачка,
гарантируется, что всегда будет хотя бы один не спящий поток,
который её захавает.
1
22.03.2016, 13:52

Не по теме:

Цитата Сообщение от hoggy Посмотреть сообщение
и ждать своего часа.
Звучит как отсылка к
Цитата Сообщение от H. P. Lovecraft
«В своем доме в Р’льехе мёртвый Ктулху спит, ожидая своего часа»
:scare::D

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.03.2016, 13:52
Помогаю со студенческими работами здесь

Два потока в одной программе
Две фунцкии одной программы оформить как две функции потока. После ввода значений запускаются два требуемых потока, а потом на экран...

Два потока выводят информацию в консоль
Дана задача: Два потока выводят информацию в консоль. Один выводит время прошедшее с момента запуска ОС, другой позицию курсора...

Найти два максимальных числа из потока
Здравствуйте, нужна ваша помощь. Нужно найти два максимальных числа из одного файла и записать их в другой файл. Сделала так, а опыта и...

Как разделить на два потока умножение матрицы?
Составил алгоритм умножения матриц, однако не совсем могу понять, какие задать параметры для функции MultMatrixThread, чтобы программа...

Как синхронизировать между собой два потока
Привет, народ. Есть вопросик по потокам. Callback функция постоянно дёргает решатель в отдельном потоке. В примере это цикл в функции...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! в-строка - входное арифметическое выражение в инфиксной(обычной). . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru