В настоящее время у меня есть программа с x. Во время основного цикла y задачи выполняются для рабочих, но после отправки задач я должен дождаться завершения всех задач перед тем, как предшествовать программе. Я считаю, что мое текущее решение неэффективно, должен быть лучший способ дождаться завершения всех задач, но я не уверен, как это сделать.
// called in main after all tasks are enqueued to
// std::deque<std::function<void()>> tasks
void ThreadPool::waitFinished()
{
while(!tasks.empty()) //check if there are any tasks in queue waiting to be picked up
{
//do literally nothing
}
}
Дополнительная информация:
структура потока потока
//worker thread objects
class Worker {
public:
Worker(ThreadPool& s): pool(s) {}
void operator()();
private:
ThreadPool &pool;
};
//thread pool
class ThreadPool {
public:
ThreadPool(size_t);
template<class F>
void enqueue(F f);
void waitFinished();
~ThreadPool();
private:
friend class Worker;
//keeps track of threads so we can join
std::vector< std::thread > workers;
//task queue
std::deque< std::function<void()> > tasks;
//sync
std::mutex queue_mutex;
std::condition_variable condition;
bool stop;
};
или здесь gist моего threadpool.hpp
пример того, что я хочу использовать waitFinished()
для:
while(running)
//....
for all particles alive
push particle position function to threadpool
end for
threadPool.waitFinished();
push new particle position data into openGL buffer
end while
Таким образом, я могу отправить hundrends из тысяч задач позиции частиц, которые будут выполняться параллельно, дождаться их завершения и поместить новые данные в буферы позиции openGL.