我在pthreads中實現了一個粒子交互模擬器,並且在我的pthreads代碼中不斷收到分段錯誤。故障發生於下面的循環,每個線程確實在每個時間步長在我thread_routine結束:帶pthreads_mutex的Seg故障
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]);
}
奇怪的是,如果我去掉一個(也無所謂哪一個)或兩者程序按預期運行,沒有錯誤發生(但這顯然會導致性能下降,並不是一個優雅的解決方案),從而提供正確的輸出。
框是一個全局聲明 矢量<矢量<矢量< particle_t *>>>框 表示我的(正方形)結構域的一個分解成箱。
當循環開始時,對於所有i,j,box [i] [j] .size()已被設置爲零,並且該循環應該將粒子放回盒結構中(get_id函數給出正確的結果,我已經檢查)
數組pthread_mutex_t鎖被聲明爲一個全球性的
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,代碼也會運行,並且似乎運行的處理器越多,出現seg錯誤的時間越早(它已經在兩個處理器上運行過整個模擬器,但這似乎是一個除外)
感謝
cout不是線程安全的。 – Erik 2011-03-01 20:37:42
當cout被註釋掉時會出現問題 – Simen 2011-03-01 20:42:25
get_id是什麼樣的? – 2011-03-01 20:53:46