2014-09-09 1 views
2

Распределение кучи является узким местом в моем приложении, и я хотел бы избежать их при отправке небольших задач в пул потоков.Уменьшение количества распределений кучи при постановке в очередь задач

Могу ли я использовать std::packaged_task с распределителем стека? В каких условиях? Каковы плюсы и минусы этого выбора? Существуют ли лучшие альтернативы, чтобы избежать распределения кучи общего состояния std::future оператором new?

auto foo() { 
    arena<1024> buffer; 
    auto task = std::packaged_task<int()>{ 
    std::allocator_arg_t, 
    arena_allocator{arena}, 
    []() -> int { return 5; } 
    }; 
    auto f = task.get_future(); // is this future and its shared state stack allocated? 
    thread_pool.push_back(std::move(task)); 
    // I will probably need to block before the stack goes out of scope.. 
    return f.get(); 
} 
+0

Если вы собираетесь заблокировать ожидание выполнения другого потока для выполнения задачи, вы можете просто запустить задачу в этом потоке напрямую. Похоже, что это поражает весь смысл нескольких потоков. –

+1

@IgorTandetnik Я собираюсь гарантировать, что вычисление закончится до возвращения, это не значит, что я буду ждать. Это позволяет мне делать что-то еще в этом потоке, в то время как некоторые вычисления выполняются в другом потоке или для запуска нескольких вычислений для нескольких потоков. Это также позволяет мне передавать будущее по стеку по мере его роста ... Или даже выполнить вычисление в отдельном потоке, если я гарантирую, что он завершится до того, как локальный стек, в котором живет разделенное состояние, будет недействительным. – gnzlbg

ответ

2

Ваш «мне, вероятно, придется блокировать до того, как стек выходит из сферы действия», комментарий четко указывает на единственную проблему здесь. Единственное, что вы должны убедиться в том, что, поскольку задача в стеке отправляемого потока, он должен оставаться там, пока ваш пул потоков не выполнит его.

Кроме этого, нет проблем с использованием стека вместо распределения кучи.