C ++, как ро запустить несколько фоновых функций потока, которые могут быть вызваны в любое время? - PullRequest
0 голосов
/ 14 января 2019

В C ++ есть способ создать, скажем, 5 потоков в начале кода, а затем позволить им ждать в фоновом режиме в течение всего времени выполнения основной части моего кода? Эти 5 потоков ожидают вызова в различные моменты времени во время основного процесса кода.

Мне нравится, что эти 5 потоков «содержат» функцию, так что в какой-то момент в основной части моего кода (после предварительной обработки 5 входов) я могу одновременно вызывать эти 5 потоков для асинхронного вычисления 5 возвращаемых значений 5 входов в параллельны друг другу.

Я думаю, что могу сделать это, используя std :: async, но я хочу избежать больших затрат, связанных с созданием новых 5 потоков, которые может делать std :: async несколько раз, поэтому я просто хочу, чтобы эти 5 потоков создавались на начать код и находиться в фоновом режиме в режиме ожидания, пока я не позвоню им.

1 Ответ

0 голосов
/ 14 января 2019

Распространенное заблуждение заключается в ваших словах: «вызовите ветку». Вы не можете "вызвать" поток. Это не функция. Это просто концепция планирования работы. Вы можете создать поток и выполнить задачу в среде потока.

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

То, что вы хотели, это создать пул потоков постоянного размера. В этом случае каждый поток должен запустить задание, которое зацикливается в ожидании готовности данных. Распространенным способом является проверка события с помощью условной переменной std :: condition_variable в c ++ 11. Когда ввод готов, основной поток сигнализирует переменную, и поток может читать данные. Нет никакого способа узнать, какой поток пробуждается, когда кто-то сигнализирует переменную. Таким образом, вы должны убедиться, что входы правильно распределены между потоками. Итак, это более сложный метод, который в основном используется для управления ресурсами и может обеспечить некоторое повышение производительности в системах с большим количеством коротких задач.

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

...