pthreads を使用していくつかの処理を行うプログラムを作成しました。プログラムを実行するたびに奇妙な動作が発生します。簡単にするために、処理行にコメントを付けました。エラーはまだ発生しています。それがコードです(関連部分):
pthread_t Thread[THREAD_NUM];
pthread_barrier_t BarrierStart;
pthread_rwlock_t DebugLock;
void T2_FFT_Comp(void)
{
int Return;
T2_FFT_Comp_Input ThreadInput;
Return = pthread_rwlock_init(&DebugLock,NULL);
if (Return)
{
cout << endl << "Error while creating lock ";
}
pthread_barrier_init(&BarrierStart,NULL,THREAD_NUM);
for(int i = 0;i < THREAD_NUM;i++)
{
ThreadInput.Start = i*ThreadDataSize; //struct is relevant to processing part
ThreadInput.ThreadNum = i;
Return = pthread_create(&Thread[i],NULL,T2_FFT_Comp_ThreadFn,(void *)&ThreadInput);
pthread_rwlock_wrlock(&DebugLock);
cout << endl << "creating thread number " << i;
pthread_rwlock_unlock(&DebugLock);
if (Return)
{
cout << endl << "Error while creating thread #" << i;
}
}
for (int i = 0;i<THREAD_NUM;i++)
{
Return = pthread_join(Thread[i],NULL);
if (Return)
{
pthread_rwlock_wrlock(&DebugLock);
cout << endl << "Error while joining thread Number : " << i;
pthread_rwlock_unlock(&DebugLock);
}
}
pthread_rwlock_destroy(&DebugLock);
return;
}
void *T2_FFT_Comp_ThreadFn(void *input)
{
int InputStart = ((T2_FFT_Comp_Input *)input)->Start;
int ThreadID = ((T2_FFT_Comp_Input *)input)->ThreadNum;
int Return;
pthread_rwlock_wrlock(&DebugLock);
cout << endl << "Thread number : " << ThreadID << " created";
pthread_rwlock_unlock(&DebugLock);
pthread_exit(NULL);
}
プログラムは奇妙な動作をします。場合によってはセグメンテーション違反です。時々、このような出力が生成されます
creating thread number 0
Thread number :0 created
creating thread number 1
creating thread number 2
creating thread number 3
Joining Thread Number : 0
Thread number :3 created
Thread number :3 created
Thread number :3 created
作成されたスレッドの数が正しい場合と間違っている場合があります。また、複数の結合線が存在する場合もあります。なぜこれが起こるのかわかりません。