2013-10-02 1 views
2

저는 지금 표준 라이브러리를 사용하여 멀티 스레딩을 시작했습니다. 아래는 지금까지 내가 생각해내는 것입니다. 원칙적으로 작동하지만, 일단 완료되면 새 스레드를 시작하지 않고 마지막 4 개가 완료되면 4 개의 스레드를 시작하기 때문에 작업에 불리한 양의 시간이 걸리면 효율성이 떨어집니다. 또한 올바른 순서로 끝나지 않으면 결과가 평가 될 때까지 후속 작업이 끝날 때까지 기다려야합니다.항상 주어진 수의 스레드가 있는지 어떻게 확인할 수 있습니까? (또한 스레드의 좋은 사용법입니까?)

어떻게하면 작업이 끝날 때까지 항상 4 개의 스레드를 얻을 수 있습니까? 나는 당신이 일종의 감시자 기능을 사용할 필요가 있다고 생각 하겠지만, 신호/슬롯없이 정확히 그것이 어떻게 가능한지 보지 못한다. 온라인으로 올바른 설명서를 가르쳐 주시면 기쁜 마음입니다.

또한 오늘 전에 멀티 프로세싱을 사용해 본 경험이 없으므로 나쁜 습관을 사용했을 수도있는 곳을 말해주십시오.

미리 감사드립니다.

mueslo 여기


는 스레드 작업입니다 :

void burn_task(MyClass* obj) 
{ 
    //computationally intensive 
    obj->burn(); 
} 

그리고 여기를 호출하는 방법입니다

void getsStuffDone() 
{ 
    //initialise everything 
    int samples = 1000;  
    int num_threads = 4; 

    std::vector<MyClass*> myclasslist; 
    std::vector<std::thread*> threadlist; 

    myclasslist.resize(num_threads); 
    threadlist.resize(num_threads); 

    int i = 0; 

    //do the work 
    while(i+1<samples) 
    { 
     //current_num_threads = min(num_threads, num_tasks_left) 
     int current_num_threads = (samples-i-1>num_threads)? num_threads : samples-i-1; 

     //create threads 
     for(int t=0; t<current_num_threads; ++t) 
     { 
      myclasslist[t] = new MyClass(other_parameters,i+1); //i+1 so seed is never zero 
      threadlist[t] = new std::thread(burn_task, myclasslist[t]); 
      ++i; 
     } 

     //wait to finish, evaluate and clean up (delete) 
     for(int t=0; t<current_num_threads; ++t) 
     { 
      threadlist[t]->join(); 

      useResultsContainedWithin(myclasslist[t]) 

      delete myclasslist[t]; 
      delete threadlist[t]; 
     } 

     threadlist.clear(); 

    } 
} 

답변

2

스레드의 세트 수를 처리하기위한 일반적인 방법 어떤 작업을 수행하는 것은 X 스레드를 시작한 다음 각 스레드가 공통 큐에서 "작업"을 선택하도록하는 것입니다. 정말 간단한 경우, 당신은 단순히 대신 스레드를 생성하는 루프에서 i+1i++을하는, istd::atomic<int>하자, 그리고 할 거라고 : 더 복잡한 경우

void some_thread_function() 
{ 
    for(;;) 
    { 
    int work_on = i.fetch_add(1);  // "work_on = i++;" 
    if (work_on >= samples) 
     break; 
    ... // do actual work 
    } 
} 

을, 당신은 좋겠 수행 할 "작업"을 설명하기 위해보다 복잡한 데이터 유형을 포함하는 대기 대기열이 있어야합니다.

이것은 항상 "올바른"개수의 스레드가 있고 스레드를 생성/분리하는 데 오버 헤드가 없음을 의미합니다. 스레드가 꽤 오랜 시간 (10 분의 1 초 이상) 실행되는 경우 어쨌든 문제는 아니지만 "짧은"런타임에 대해서는 아마도 요소 일 것입니다.

+0

그리고 거기에 결말을 맺고 있습니다 ... – SirGuy

+0

그래, 난 아직 원자 데이터 유형에 익숙하지 않아. – mueslo

+0

@GuyGreer : "내가 문구를 다르게 결정한 것의 남은 부분" –

관련 문제