|
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
|
|||||||||||
Пул потоков - непонятки22.10.2023, 18:13. Показов 1578. Ответов 25
Метки нет (Все метки)
Здравствуйте!
Для своей демки честно стырил в инете вариант реализации пула потоков. Посмотрел его, поковырял - вроде, все понятно, но все же не все))) Вот его реализация:
Честно пытался читать в инете, но недопонимаю. Lock, как я понимаю, это мьютекс(q_mtx), который предварительно захвачен. completed_task_ids_cv.wait() должен этот мьютекс освободить, если лямбда вернет true. Правильно? Как выполняется тело лямбды? Крутится постоянно, пока не выполниться условие? Или как? У меня "висит" на строке std::unique_lock<std::mutex> lock(q_mtx) - такое впечатление, что wait_all() вызвался повторно, до освобождения мьютекса q_mtx и не может его захватить. Но по стеку видно, что повторного вызова нет. Может я чего-то недопонимаю? По алгоритму демки, я "подкидываю" задачи в пул потоков, в месте, где нужны результаты, жду при помощи вот этой вот функции wait_all() Подавляющее количество времени оно все работает. Но иногда, очень редко, "зависает" в этой функции на этой строке. Демку могу приаттачить, но она без wxWidgets не соберется.
0
|
|||||||||||
| 22.10.2023, 18:13 | |
|
Ответы с готовыми решениями:
25
Есть ли в C++ пул потоков Пул потоков thread Пул потоков с семафорами |
|
274 / 206 / 31
Регистрация: 26.11.2022
Сообщений: 891
|
|
| 24.10.2023, 12:25 | |
|
признак простоя пула - это не пустота в списке задач.
Я у себя в пуле потоков делал два атомарных счётчика - количество работающих потоков в пуле и счётчик активных потоков. Перед вызовом функции задания из очереди счётчик увеличивался а после возврата - уменьшался. И для завершения пула потоков вначале блокировалось добавление новых заданий в очередь, а если оно происходило - то задания выполнялись сразу на мете. Потом ожидалось опустошение очереди, потом ожидалось обнуление счётчика. решение имеет недостатки но надёжное.
0
|
|
|
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
|
|||
| 24.10.2023, 16:05 [ТС] | |||
|
Я имел ввиду список задач, выполняющихся в текущий момент. Но можно вообще одним счетчиком обойтись - количеством потоков, работающих в текущий момент + очередь ожидающих задач.
0
|
|||
|
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
|
|
| 25.10.2023, 15:37 [ТС] | |
|
Все-таки не получется разобраться. Разьясните, пожалуйста, этот момент с contitional_variable:
1. В функцию wait() передается захваченный мьютекс и некое условие. 2. В функции wait() contitional_variable освобождает этот мьютекс и ждет? Или проверяет условие? Что там внутри происходит? В документации сказано, что из какого-то другого потока должен быть послан сигнал notify_one() или notify_all() этой же contitional_variable для того, чтобы проинформировать ее, что условие поменялось. Правильно ли я понимаю, что contitional_variable не проверяет это условие постоянно, а ждет сигнала и только после него проверяет, и если оно выполнено - захватывает мьютекс и выходит из wait() Если это так - тогда зачем вообще это условие, когда все равно нужен внешний сигнал?
0
|
|
|
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,828
|
||||
| 25.10.2023, 17:14 | ||||
|
1
|
||||
|
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
|
|
| 25.10.2023, 18:46 [ТС] | |
|
0
|
|
|
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,828
|
|
| 25.10.2023, 19:37 | |
|
Constcat, не, первый раз условие проверяется до ожидания. Так что если оно уже выполнено, то ожидания не будет.
1
|
|
| 25.10.2023, 19:37 | |
|
Передача функции с параметрами в пул потоков Пул потоков на основе boost::lockfree::queue Реализовать пул потоков, в который можно помещать функцию
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
| Опции темы | |
|
|
Новые блоги и статьи
|
|||
|
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет:
1. Использовать системное время и дату,
2. Есть возможность вводить время и дату вручную.
3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
|
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber.
Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
|
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео:
https:/ / vkvideo. ru/ video-240781534_456239017
YouTube:
eY5-5PyI9NM
Текстовая версия
|
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать
Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
|
|
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства.
Родственных связей существует 8 ступеней, такие как:
p - отец
P - мать
q - муж
Q - жена
b - брат
B - сестра
s - сын
S - дочь
|
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире.
Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
|
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С.
Задача:
Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
|
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
|