2012-12-12 3 views
1

처리해야 할 요소가있는 큐가 있습니다. 이러한 요소를 병렬로 처리하려고합니다. 동기화가 필요한 각 요소의 일부 섹션이됩니다. 어떤 시점에서든 최대 num_threads 개의 실행 스레드가있을 수 있습니다.thread building block with pthreads

템플릿을 제공하여 내가 원하는 것을 제공합니다.

queue q 

process_element(e) 
{ 
    lock() 
    some synchronized area 
    // a matrix access performed here so a spin lock would do 
    unlock() 
    ... 
    unsynchronized area 
    ... 
    if(condition) 
    { 
     new_element = generate_new_element() 
     q.push(new_element) // synchonized access to queue 
    } 
} 

process_queue() 
{ 
    while(elements in q) // algorithm is finished condition 
    { 
     e = get_elem_from_queue(q) // synchronized access to queue 
     process_element(e) 
    } 
} 

내가 사용할 수 있습니다

  • 의 pthreads
  • OpenMP를
  • 인텔 스레드 빌딩 블록

최고 문제는 내가

,369이
  • 것은 어떤 시점에서 내가 큐에 사용하는 최대 NUM_THREADS 실행 스레드
  • 경량 동기화 방법이 있는지 확인

내 계획은 큐 컨테이너에 대한 인텔 TBB의 concurrent_queue이다. 그렇다면 pthreads 함수 (뮤텍스, 조건)를 사용할 수 있습니까? 이것이 제대로 작동한다고 가정 해 봅시다. 그런 다음 pthread를 사용하여 한 번에 최대 num_threads를 갖는 방법은 무엇입니까? 한 번 쓰레드를 생성하고, 하나의 요소가 처리 된 후에 큐에 접근하여 다음 요소를 얻으려고했다. 그러나 큐에 요소가 없으면 알고리즘이 완료된다는 보장이 없으므로 더 복잡합니다.

내 질문

나는 내가 원하는 동작을 얻기 위해 인텔 TBB 또는의 pthreads를 사용하는 쉬운 방법이 있는지 알고 싶습니다 구현을 시작하기 전에? 대기열에서 병렬로 더 정확하게 처리 요소

참고 : 나는 작업을 사용하려했지만 성공하지 못했습니다.

+0

요소의 컨테이너 인 경우 각 요소를 조작하는 데 parallel_for를 사용하지 않는 이유는 무엇입니까? 또는 대기열을 사용해야하는 경우 task_group을 pop과 함께 사용하십시오. – Rick

답변