プログラムは複数のスレッドを作成し、forループを使用して各スレッドが共有変数を10000ずつインクリメントし、繰り返しごとに1ずつインクリメントします。 mutexロックとスピンロック(ビジー待機)の両方のバージョンが必要です。私が学んだことによると、ミューテックスのバージョンはスピンロックより速く動作するはずです。ミューテックスとビジー待機の効率測定
void *incr(void *tid)
{
int i;
for(i = 0; i < 10000; i++)
{
pthread_mutex_lock(&the_mutex); //Grab the lock
sharedVar++; //Increment the shared variable
pthread_mutex_unlock(&the_mutex); //Release the lock
}
pthread_exit(0);
}
そして、これは、スピンロックバージョンで実装したものです::
void *incr(void *tid)
{
int i;
for(i = 0; i < 10000; i++)
{
enter_region((int)tid); //Grab the lock
sharedVar++; //Increment the shared variable
leave_region((int)tid); //Release the lock
}
pthread_exit(0);
}
void enter_region(int tid)
{
interested[tid] = true; //Show this thread is interested
turn = tid; //Set flag
while(turn == tid && other_interested(tid)); //Busy waiting
}
bool other_interested(int tid) //interested[] is initialized to all false
{
int i;
for(i = 0; i < tNumber; i++)
if(i != tid)
if(interested[i] == true) //There are other threads that are interested
return true;
return false;
}
void leave_region(int tid)
{
interested[tid] = false; //Depart from critical region
}
しかし、私が実装する。これは、ミューテックスのバージョンでは、各スレッドのinplementationです...私に
を反対の答えを与えました
スレッドの作成と実行のプロセスを何百回も繰り返して、実行時間を区別できるようにしました。 たとえば、tNumberが4で、プログラムを1000回反復した場合、mutexは私に2.22秒かかり、スピンロックは1.35秒かかります。 tNumberが増加するにつれてその差は大きくなります。なぜこうなった?私のコードは間違っていますか?
あなたの「スピンロック」は何もロックしません。それはマルチコアCPU上で正しく動作することはありません。確かに、ボルケンコードはもっと速くなる可能性があります。並行性と共有変数の値が間違っているかどうかを確認するためには、ループを長くする必要があります。 –
@ HansPassant修正。私は、スピンロックの正しい実装は、ほとんどの場合、ある種のテスト&セットまたはロードリンク/ストア条件付きの構造を使用し、ハードウェア固有の傾向があると付け加えます。 –
このコードは、大学のテストのコードとほぼ同じです。少なくとも私たちのところで。 – UmNyobe