問題を説明するためにいくつかの疑似コードを使用してここに要約したプロジェクトがあります。コンパイラの問題はなく、boost または pthreads を使用しているかどうかにかかわらず、コードは適切にコンパイルされます。これは、問題を説明するために設計された疑似コードであり、直接コンパイルできないことに注意してください。
私が抱えている問題は、マルチスレッド関数の場合、for/while ループなどのシリアル プログラミングを使用して同じ関数を実行した場合よりも、メモリ使用量と処理時間が常に長くなることです。
これは、私が直面している問題の簡略版です。
class aproject(){
public:
typedef struct
{
char** somedata;
double output,fitness;
}entity;
entity **entity_array;
int whichthread,numthreads;
pthread_mutex_t mutexdata;
aproject(){
numthreads = 100;
*entity_array=new entity[numthreads];
for(int i;i<numthreads;i++){
entity_array[i]->somedata[i] = new char[100];
}
/*.....more memory allocations for entity_array.......*/
this->initdata();
this->eval_thread();
}
void initdata(){
/**put zeros and ones in entity_array**/
}
float somefunc(char *somedata){
float output=countzero(); //someother function not listed
return output;
}
void* thread_function()
{
pthread_mutex_lock (&mutexdata);
int currentthread = this->whichthread;
this->whichthread+=1;
pthread_mutex_unlock (&mutexdata);
entity *ent = this->entity_array[currentthread];
double A=0,B=0,C=0,D=0,E=0,F=0;
int i,j,k,l;
A = somefunc(ent->somedata[0]);
B = somefunc(ent->somedata[1]);
t4 = anotherfunc(A,B);
ent->output = t4;
ent->fitness = sqrt(pow(t4,2));
}
static void* staticthreadproc(void* p){
return reinterpret_cast<ga*>(p)->thread_function();
}
void eval_thread(){
//use multithreading to evaluate individuals in parallel
int i,j,k;
nthreads = this->numthreads;
pthread_t threads[nthreads];
//create threads
pthread_mutex_init(&this->mutexdata,NULL);
this->whichthread=0;
for(i=0;i<nthreads;i++){
pthread_create(&threads[i],NULL,&ga::staticthreadproc,this);
//printf("creating thread, %d\n",i);
}
//join threads
for(i=0;i<nthreads;i++){
pthread_join(threads[i],NULL);
}
}
};
ここで pthread を使用しているのは、メモリの少ないマシンではブーストよりもうまく機能するためです。各スレッドは eval_thread で開始され、そこで終了します。各スレッドは、変数 this->whichthread によってインデックス付けされたそれぞれの entity_array にのみ作業を適用するため、mutex を使用して、すべてのスレッドが entity_array の正しいインデックスで開始されるようにしています。この変数は、スレッドごとに更新され、他のスレッドによって変更されてはならないため、ミューテックスによってロックする必要がある唯一のものです。thread_function、eval_threads、および staticthreadproc を除く他のすべての関数は、init を除く他のすべての関数がプロセッサとメモリの両方を集中的に使用することを想定している唯一の関連関数であるため、喜んで無視できます。
では、私の質問は、この方法でマルチスレッドを使用すると、スレッドをまったく使用しない従来の方法よりもメモリと速度の面で IT のコストが高くなるのはなぜですか?
繰り返しますが、コードは疑似コードであり、問題はコンパイルできるかどうかではありません。
ありがとうございます。pthread やブースト ソリューションに関するご提案をいただければ幸いです。