パーティクルインタラクションシミュレーターをpthreadに実装していますが、pthreadコードでセグメンテーション違反が発生し続けています。障害は次のループで発生します。これは、各スレッドが私のthread_routineの各タイムステップの最後に実行します。
for (int i = first; i < last; i++)
{
get_id(particles[i], box_id);
pthread_mutex_lock(&locks[box_id.x + box_no * box_id.y]);
//cout << box_id.x << "," << box_id.y << "," << thread_id << "l" << endl;
box[box_id.x][box_id.y].push_back(&particles[i]);
//cout << box_id.x << box_id.y << endl;
pthread_mutex_unlock(&locks[box_id.x + box_no * box_id.y]);
}
奇妙なことに、一方(どちらかは関係ありません)または両方のcoutのコメントを外すと、プログラムは期待どおりに実行され、エラーは発生しません(ただし、これは明らかにパフォーマンスを低下させ、エレガントなソリューションではありません)、正しい出力を提供します。
boxは、グローバルに宣言されたvector <vector <vector <particle_t * >>>ボックスであり、私の(正方形の)ドメインをボックスに分解したものを表します。
ループが開始すると、box [i] [j] .size()はすべてのi、jに対してゼロに設定され、ループはパーティクルをボックス構造に戻すことになっています(get_id関数は正しい結果を返します。確認しました)
配列pthread_mutex_tlocksはグローバルとして宣言されています
pthread_mutex_t * locks
、
サイズはスレッド0によって設定され、ロックは他のスレッドが作成される前にスレッド0によって初期化されます。
locks = (pthread_mutex_t *) malloc( box_no*box_no * sizeof( pthread_mutex_t ) );
for (int i = 0; i < box_no*box_no; i++)
{
pthread_mutex_init(&locks[i],NULL);
}
何がこれを引き起こす可能性があるかについて何か考えがありますか?プロセッサの数が1に設定されている場合もコードが実行され、実行するプロセッサの数が多いほど、セグメンテーション違反が早く発生するようです(2つのプロセッサでシミュレーション全体を1回実行しましたが、これは例外)
ありがとう