У меня есть пул потоков, где каждый поток должен быть ожидающим потоком и постоянно слушать новые задачи для их асинхронной обработки (обработка занимает много времени).Тем не менее, в следующем коде я не могу получить это поведение.Проблема в том, что когда я создаю пул потоков, они успешно выполняют первую заданную задачу.Функция process () достигает значения de return 0;
, пока потоки выполняют вычислительные задачи, но никогда не возвращается к main () .Он стоит в строке v.wait(l, [&] {return !tasks.empty(); });
, то есть все еще ожидает добавления новых задач в очередь задач, и этого никогда не происходит.Я читал, что это что-то, связанное с деструктором std :: future: Если я не ошибаюсь, я думаю, что когда process () достигает возврата, вызывается деструктор std :: future, и он ждетпока все потоки не заканчиваются, но они никогда не заканчиваются!
Вот код:
static int callings = 0;
class ThreadPool
{
private:
std::queue<int> tasks;
std::mutex m;
std::vector<std::future<void>> finished;
std::condition_variable v;
public:
void push_task(int arg) {
std::unique_lock<std::mutex> l(m);
tasks.push(arg);
v.notify_one(); // wake a thread to work on the task
}
void read_tasks() {
while (true) {
std::unique_lock<std::mutex> l(m);
if (tasks.empty()) {
//waits till new task
v.wait(l, [&] {return !tasks.empty(); }); //after completing the first task, the program stays here forever
}
int task = tasks.front(); // read task
tasks.pop(); //delete task
//run the task
std::this_thread::sleep_for(std::chrono::milliseconds(5 * 1000)); //simulate computation
}//while true
}
void create_thread_pool(int m_threads_count) {
for (int t_i = 0; t_i < m_threads_count; t_i++) {
finished.push_back(std::async(std::launch::async,[this] { read_tasks(); }));
printf("Thread %d is doing work...\n", t_i);
}
}
}; //ThreadPool
int process(){
ThreadPool pool;
if(callings == 0)
{
pool.create_thread_pool(4);
}
//give some task to do...
pool.push_task(callings);
callings++;
return 0; //point reached but never returning to main
}
int main(){
while(true){
// do things...
process();
// do more things...
// this does not execute, how to solve this?
}
return 0;
}
Как я могу вернуться к main (), пока потоки продолжают ждать новых задач безблокировка?
Заранее спасибо