2010-12-24 4 views
1

작업 (펑터)의 글로벌 공유 대기열이있는 간단한 스레드 풀입니다.스레드 풀 : 실행중인 작업에서 하위 작업을 생성하는 방법?

각 작업자 (스레드)는 작업자로부터 하나의 작업을 선택하여 실행합니다. 이 작업이 끝날 때까지는 다음 작업을 실행하지 않습니다.

자식 작업을 생성하여 데이터를 생성해야하는 큰 작업을 생각한 다음 평가 (예 : 디스크에 저장하기 전에 큰 배열을 정렬)와 같은 작업을 계속할 수 있습니다. 작업 코드의

의사 코드 :

do some stuff 
    generate a list of child tasks 
    threadpool.spawn (child tasks) 
    wait until they were executed 
    continue my task 

작업이 자식 작업을 위해 대기하고 있기 때문에 노동자가 죽은 잠금, 스레드 풀 끝까지 상위 타스크를 기다리는 것이다 문제는 그 중 하나를 실행하기 전에. 어떻게 모든 작업이 효율적으로 실행 된 것을 알 수

threadpool.push (tasks) 
    while (not all incoming task were executed) 
     t = threadpool.pop() 
     t.run() 
    return (and continue executing parent task) 

하지만 :

threadpool.spawn 의사 코드 :

하나의 아이디어는 스폰 코드 내 자식 작업을 실행하는 것입니다 방법?

l = generate a list of child tasks 
    threadpool.push (l , high priority) 
    t = create a task to work with generated data 
    threadpool.push (t , lo priority) 

하지만 난이 꽤 방해 발견 ...

어떤 의견 :

작업 의사 코드 :

또 다른 생각은 .. 같은 것을 부모 작업을 분할하는 것입니다?

pd. 메리 크리스마스! pd2. 어떤 나쁜 이름을 편집했습니다.

+0

"문제는 작업이 자식 작업을 기다리고 스레드 풀이 자식 작업을 실행하기 전에 부모 작업이 끝나기를 기다리고 있기 때문에 작업자가 데드 록하게됩니다." - 당신이 만들고있는 가정입니까? 상위 작업이 실행중인 경우에도 하위 작업을 실행할 스레드 풀이 있습니다. Java Executors가이를 수행 할 수 있습니다. –

+0

어떤 종류의 cr * ppy threadpool입니까? 다른 스레드를 실행하기 전에 스레드를 완료해야하는 스레드 풀은 스레드 풀이 아닙니다. –

+0

SB : ofc,하지만 C++에서 직접 스레드 풀을 코딩 중입니다. 직접 그 기능을 구현하는 방법을 묻습니다. –

답변

0

자식 스레드가 완료 될 때마다 자식 스레드가 주 작업자에게 다시 신호를 보내도록 메커니즘을 가질 수 있습니다. Java에서는 스레드 풀에 ExecutorService 작업을 제출하면 결과가 Future의 데이터 구조로 응답합니다. 또 다른 방법은 스레드가 완료 될 때마다 업데이트되는 공통 카운트 다운 메커니즘으로 사용되는 CountDownLatch과 비슷한 별도의 완료 신호를 유지하는 것입니다.

+0

내가 말했듯이, 나는 스레드 풀을 사용하고있다. 그래서 나는 만들 수있는 새로운 스레드의 수에 한계가있다. 현재 작업이 다른 스레드를 기다리는 것을 차단하면 종료하지 않습니다. 자식 작업을 기다리고있는 모든 스레드로 나 자신을 찾을 수 있습니다. –