2012-12-16 4 views
3

나는 tbb::task_group과 같은 것을 원하지만 주문 실행의 보장과의 차이점이 있습니다.TBB로 실행하려면?

serial_task_group tasks; 

tasks.run([]{std::cout << 1;}); 
tasks.run([]{std::cout << 2;}); 
tasks.run([]{std::cout << 3;}); 
tasks.wait(); 

// guaranteed output: 123 

tbb를 사용하여 어떻게 달성 할 수 있습니까?

현재 조건 변수를 사용하여 대기열에서 실행되는 명시 적 스레드가 있습니다. 그러나 대기열을 사용할 때의 문제점은 정확히 정확히 하나의 작업 만 task_group에서 활성화된다는 것을 의미합니다. .

+0

실제로 무엇을 성취하려고하는지 알 수 없습니다. 내가 올바르게 이해한다면 단지 한 번에 하나씩 순서대로 실행되어야합니다. 그러나이 경우에는'task_group'을 위해 필요한 것을 보지 못합니다. 동시 실행이 없다면'task' 구조체에 위임하는 대신 호출하는 쓰레드/함수에서 직접 필요한 모든 작업을 수행 할 수 있습니다. 그리고 질문의 마지막 부분에 관해서 : 한 번에 하나 이상의 스레드가 작업을 실행하는 경우 한 번에 하나의 작업이 활성화 될 것입니다? – Grizzly

+0

@ Grizzly : 다른 많은 동시 작업이 진행 중입니다. 그러나 여기에서 실행하려는 특정 계산은 순서대로 실행해야하며 매우 무겁습니다. 작업 스케줄러를 사용하는 대신 명시 적 스레드를 사용하는 경우 초과 가입으로 인해 상당한 오버 헤드가 발생합니다. 여기 내 목표는 작업 스케줄러에서 모든 것을 실행하는 것입니다. – ronag

+1

tbb 흐름 그래프를 보았습니까? 윈도우즈에서 에이전트 라이브러리는 이것을 쉽게 수행 할 수 있습니다. tbb 플로우 그래프는 가장 비슷한 것입니다. – Rick

답변

7

(공개 :. 나는 인텔에서 인텔 스레딩 빌딩 블록 작업)

으로는 다른 답변에서 제안되었으며,이 같은 작업을 수행 할 흐름 그래프를 사용할 수 있습니다. 흐름 그래프를 사용하는 예제의 코드는 다음과 같습니다.

#include "tbb/flow_graph.h" 
#include <iostream> 

using namespace tbb::flow; 

int main(int argc, char *argv[]) { 
    graph g; 
    continue_node<continue_msg> n1(g, [](const continue_msg &) { std::cout << "1"; }); 
    continue_node<continue_msg> n2(g, [](const continue_msg &) { std::cout << "2"; }); 
    continue_node<continue_msg> n3(g, [](const continue_msg &) { std::cout << "3"; }); 
    make_edge(n1, n2); 
    make_edge(n2, n3); 
    n1.try_put(continue_msg()); 
    g.wait_for_all(); 
    return 0; 
} 
+1

내가 원했던 것은 아니지만, 게시 한 내용 (아마도 http://pastebin.com/i2rxGKsP)에 기반을 두었습니까? – ronag

+1

예 예. 노드는 직렬이므로 함수를 순서대로 수신하고 실행하며 절대로 실행을 겹치지 않습니다. 그리고 이들은 TBB 작업으로 계획되어 시스템의 다른 TBB 작업과 동시에 실행할 수 있습니다. –

+0

모든 작업이 병렬로 실행되도록 객체를 생성해야하는 것보다 간단한 방법이 있어야합니다. 이는 실현 가능하지 않거나 완전히 불필요 할 수 있습니다. –

관련 문제