Я внедряю симулятор взаимодействия частиц в 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]);
}
Странно то, что если я раскомментирую один (не важно, какой) илиВ обоих случаях программа работает так, как и ожидалось, без ошибок (но это, очевидно, снижает производительность и не является элегантным решением), обеспечивая правильный вывод.
- это глобально объявленный вектор <вектор <vector <частиц_т *>>> блок, который представляет разложение моего (квадратного) домена на блоки.
Когда цикл начинается, box [i] [j] .size () был установлен в ноль для всехi, j и цикл должен возвращать частицы обратно в коробчатую структуру (функция get_id выдает правильные результаты, я проверял)
Массив pthread_mutex_t lock объявлен как глобальный
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, и кажется, что чем больше процессоров я использую, тем раньше происходит ошибка сегмента (он прошел всю симуляцию один раз на двух процессорах, но это, похоже,исключение)
Спасибо