В настоящее время я тестирую pthreads для использования, чтобы ускорить другой код, который у меня есть. По сути, мой код в настоящее время представляет собой пару циклов for, которые в итоге выполняют матричные вычисления. Я попробовал порождать потоки, которые будут выполнять эти вычисления одновременно, и в итоге время выполнения сократилось вдвое.
Мой вопрос заключается в том, есть ли способ изначально порождать эти pthreads, заставить их запускать функцию и использовать их позже, чтобы запустить ту же функцию без их закрытия? Или нужно закрыть их после выполнения задания?
Кстати, я использую Windows, использую библиотеку pthreads.
Вы могли бы создать queue
задач, которые ваши потоки будут выбирать для новых задач и удалять из них, если таковые имеются (и желательно какой-нибудь флаг отмены, чтобы изящно остановить их).
Вам нужно сделать добавление задач поточно-ориентированным, например, используя pthread_mutex
.
Вы также можете использовать условную переменную (pthread_cond_t
) сигнализировать, когда есть еще задачи для cunsume
Таким образом, вы можете создавать столько потоков, сколько пожелаете в начале, и просто добавлять задачи, когда это необходимо.
Как примечание вы, вероятно, предпочтете менее громоздкие thread
составление стандартной библиотеки.
Почему бы не использовать полноценные библиотеки параллельной обработки или языковые расширения, такие как OpenMP, Cilk, ТВВ. Все они теперь вполне переносимы, имеют поддержку основных ОС и компиляторов. Microsoft также имеет госзакупках который является близнецом TBB.
Таким образом, вам не нужно изобретать колесо, а позволить библиотекам позаботиться о потоках и распределении нагрузки; и защитит вас от таких ловушек: Почему OpenMP превосходит потоки?
Например, вектор задач может быть запущен параллельно по умолчанию числом потоков так же просто, как (в cilk):
cilk_for(int i = 0; i < tasks.size(); i++)
task[i].some_function();
Вы также можете изменить количество потоков, если это необходимо.