簡體   English   中英

pthreads_mutex的段錯誤

[英]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以便每個線程可以一次存儲所有項目。 這實際上可能比您要嘗試的要快-更少的鎖抖動。

boxbox[i]向量是否正確初始化? 您只說設置了向量的最里面的集合。 否則,看起來box_idxy組件是錯誤的,並且從數組之一的末端開始運行。

它崩潰的外觀是哪一部分?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM