1

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

作成されたスレッドの数が正しい場合と間違っている場合があります。また、複数の結合線が存在する場合もあります。なぜこれが起こるのかわかりません。

4

1 に答える 1

2

という名前の同じローカル変数のアドレスがThreadInput各スレッドに渡されます。これは、各スレッドが非同期で同じ変数にアクセスしていることを意味します。これは競合状態であり、未定義の動作です。競合状態ではなかったとしても、意図した動作ではありません。修正するには、同じインスタンスではなく、各スレッドに異なるインスタンスを渡します ( の配列を使用しT2_FFT_Comp_Input[THREAD_NUM]て要素のアドレスを 1 つのスレッドのみに渡すか、 a を動的に割り当ててT2_FFT_Comp_Inputスレッドに渡し、スレッドfree()にそれを持たせます)。

于 2013-05-04T17:31:53.840 に答える