Библиотека пула потоков CTPL, как дождаться завершения всех потоков sh? - PullRequest
0 голосов
/ 01 августа 2020
void runner(int id, int a, int b) {...}

void caller()
{
  static ctpl::thread_pool pool(4);
  for (int i = 0; i < nbThreads; i++) {
    pool.push(runner, a, b);
  }
  pool.stop(true); // this kills all threads, meaning next time this function is called i have to create them again
}

Итак, я использую вот эту библиотеку: https://github.com/vit-vit/ctpl

Однако в этом примере я не увидел никакой функции для синхронизации потоков. Для std::thread это будет th.join(). pool.get_thread(i).join() - не решение; он замораживает, потому что поток всегда работает, чтобы принимать новые команды, что и является его предполагаемым поведением.

Единственный способ, которым я вижу эту работу, - pool.stop(true). Но если я это сделаю, потоки будут уничтожены, и в следующий раз мне придется создать их снова, что лишает возможности пула потоков.

Может ли кто-нибудь, кто использует эту библиотеку, показать мне, как синхронизировать потоки?

1 Ответ

0 голосов
/ 04 августа 2020

Используйте std::future, чтобы получить результат каждого потока. Затем используйте wait() на std::future объектах.

std::future<void> results[nbThreads];
for (int i=0; i<nbThreads; i++) results[i] = pool.push(runner, a, b);
for (int i=0; i<nbThreads; i++) results[i].wait(); // synchronize all threads
...