2014-09-09 2 views
2

힙 할당은 응용 프로그램에서 병목 현상이 발생하며 작은 작업을 스레드 풀로 보낼 때이를 방지하고 싶습니다.작업 대기시 힙 할당 수 감소

스택 할당자를 사용하여 std::packaged_task을 사용할 수 있습니까? 어떤 조건 하에서? 이 선택의 장단점은 무엇입니까? 교환 원 new에 의해 std::future의 공유 상태의 힙 할당을 피하는 더 나은 대안이 있습니까?

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

"스택이 범위를 벗어나기 전에 차단해야 할 것입니다."라는 의견은이 유일한 문제를 명확하게 나타냅니다. 당신이 보내는 스레드의 스택에있는 태스크가 스레드 풀을 실행할 때까지 머물러 있어야하기 때문에 반드시 확인해야합니다.

이외의 경우 힙 할당 대신 스택 사용에 문제가 없습니다.