Это - код, чтобы создать thread_group и выполнить все потоки параллельно:
boost::thread_group group;
for (int i = 0; i < 15; ++i)
group.create_thread(aFunctionToExecute);
group.join_all();
Этот код выполнит все потоки сразу. То, что я хочу сделать, должно выполнить их всех кроме 4 максимумов параллельно. Когда на завершается, другой выполняется, пока нет, чтобы больше не выполниться.
Другим, более эффективным решением может быть обратный вызов каждого потока к основному потоку, когда они завершаются, а обработчик на основном потоке может запускать новый поток каждый раз. Это предотвратит повторные вызовы timed_join, поскольку основной поток не будет ничего делать, пока не сработает обратный вызов.
У меня есть что-то вроде этого:
boost::mutex mutex_;
boost::condition_variable condition_;
const size_t throttle_;
size_t size_;
bool wait_;
template <typename Env, class F>
void eval_(const Env &env, const F &f) {
{
boost::unique_lock<boost::mutex> lock(mutex_);
size_ = std::min(size_+1, throttle_);
while (throttle_ <= size_) condition_.wait(lock);
}
f.eval(env);
{
boost::lock_guard<boost::mutex> lock(mutex_);
--size_;
}
condition_.notify_one();
}