저는 지금 표준 라이브러리를 사용하여 멀티 스레딩을 시작했습니다. 아래는 지금까지 내가 생각해내는 것입니다. 원칙적으로 작동하지만, 일단 완료되면 새 스레드를 시작하지 않고 마지막 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();
}
}
그리고 거기에 결말을 맺고 있습니다 ... – SirGuy
그래, 난 아직 원자 데이터 유형에 익숙하지 않아. – mueslo
@GuyGreer : "내가 문구를 다르게 결정한 것의 남은 부분" –