[英]Seg faults with pthreads_mutex
我正在pthreads中實現一個粒子交互模擬器,並且在我的pthreads代碼中不斷出現分段錯誤。 錯誤發生在以下循環中,每個線程在我的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]);
}
奇怪的是,如果我取消注釋(不管是哪一個)或兩個注釋,程序都會按預期運行,不會發生任何錯誤(但這顯然會降低性能,並且不是一個很好的解決方案),提供正確的輸出。
box是一個全局聲明的vector <vector <vector <vector <粒子_t *>>> box,它表示將我的(平方)域分解為box。
循環開始時,將所有i,j的box [i] [j] .size()都設置為零,並且該循環應該將粒子放回到box-結構中(get_id函數給出正確的結果,I已經檢查過)
數組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錯誤越早發生(它在兩個處理器上一次都在整個模擬中運行,但這似乎是一個錯誤。例外)
謝謝
這只是一個有根據的猜測,但是如果您對所有盒子使用一個鎖,這個問題就會消失: push_back
必須通過std::allocator
模板分配內存。 我認為allocator
不能保證是線程安全的,也不保證可以分配給每個vector
一個。 (底層的operator new
是線程安全的,但是allocator
通常會執行塊切片技巧來攤銷operator new
的成本。)
您是否可以使用reserve
空間為所有向量提前分配空間,這是對每個盒子中將要結成多少粒子的保守估計,這是否可行? 那是我要嘗試的第一件事。
我想嘗試的另一件事是對所有盒子使用一個鎖,我們知道這是可行的,但是將鎖定/解鎖操作移到了for
循環之外for
以便每個線程可以一次存儲所有項目。 這實際上可能比您要嘗試的要快-更少的鎖抖動。
box
和box[i]
向量是否正確初始化? 您只說設置了向量的最里面的集合。 否則,看起來box_id
的x
或y
組件是錯誤的,並且從數組之一的末端開始運行。
它崩潰的外觀是哪一部分?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.