2011-11-29 5 views
0

C# 스레드 풀을 C++로 이식하려고하지만 심각한 문제가 발생했습니다. 는 C# 스레드 풀의 기능 중 일부는 다음과 같습니다 그것을 가질 수 있도록C++에서 스레드 풀을 어떻게 구현해야합니까?

  1. 가 과부하되는 AutoResetEvent
  2. 스레드의 각 작업 항목을 사용하여 명시 적으로
  3. 각 스레드가 정의 동시 스레드의 최대 수를 정의 대리인은 개인 회원으로 기능합니다. 예를 들어

,

private static void RunOrBlock(WorkItem workitem) { 
    workItem.ThreadIndex = WaitHandle.WaitAny(threadUnoccupied); 
    ThreadPool.QueueUserWorkItem(threadWorker, workItem); 
} 

private static void threadWorker(object o) { 
    WorkItem workItem = (workItem) o; 
    workItem.Run(); 
    threadUnoccupied[workItem.ThreadIndex].Set(); 
} 

WorkItem에서는 다음과 같이 정의된다

public abstract class WorkItem { 
    protected int threadIndex; 
    public abstract void Run(); 
    public int ThreadIndex { 
    get { return threadIndex; } 
    set { threadIndex = value; } 
    } 
유사한 기능을 가진 오픈 소스 스레딩 수영장이있는 경우

사람이 알고 있나요? 그렇지 않은 경우, 그러한 스레딩 풀을 구현하는 올바른 방법은 무엇입니까? 감사!

+2

이 Boost.Threadpool 시도를 기반으로 거의 treadpool입니다 : -) –

+0

두 가지 : 1) 특히 C++ 11을 사용하는 경우에는 합리적인 수준의 스레드 풀 구현을 작성하는 데 일주일이 걸릴 수 있습니다. 2) Boost.Threadpool 라이브러리가없고, sourceforge에서 threadpool을 추천 할 수 없다. 이것은 매우 비효율적이며 순진한 디자인이다. –

+0

http://msdn.microsoft.com/en-us/library/windows/desktop/ms686980%28v=vs.85%29.aspx –

답변

2

특정 기능에 대해서는 확실하지 않지만 C++의 오픈 소스 스레드 풀은 boost threadpool 또는 zthreads입니다.

기능과 같은 스레드 풀만 필요하고이를 지원하는 컴파일러가있는 경우 openmp 3.0tasks을 사용할 수도 있습니다. "boost" threadpool이 매우 눈에 띄지 않아서 (오버 헤드가 아주 많을 수 있습니다) zthreads이 더 이상 개발되지 않은 것으로 보입니다 (최소한 언뜻보기에, 100 % 확실하지 않음). 정확히 FOSS하지에서

,하지만 당신은 라이센스와 함께 살 수있는 경우에 사용할 수 있습니다 (또는 어지간한 돈을 투자 할 준비가 ...) Intel Threading Building Blocks

관련 문제