Редактировать: ниже неверно.
Не совсем ответ, однако, когда я уменьшил количество потоков до 4, проблема исчезла.Ранее я установил число потоков равным 8, boxen - это Core i7, то есть 4 ядра с Hyper Threading.
Я могу только предположить, что существует проблема с Hyper Threading, либо в ядре OSX, либоLLVM.У меня настроены оптимизации на O3, в какой-то момент я отключу оптимизацию и посмотрю, работает ли она на 8 потоках, однако в то же время 4 потока работают только на 10% медленнее, чем 8, поэтому я буду придерживаться этого, чтобы я мог прогрессировать.
Проблема была в большом массиве в объектах, которые я удалял.Массив был создан в конструкторе и удален в деструкторе, аналогичном этому (имена членов данных были изменены):
Matrix::Matrix(int maxa, int maxb, int maxc)
{
asize = maxa;
bsize = maxb;
csize = maxc;
matrixsize = a * b * c;
matrix = new double [matrixsize];
}
Matrix::~Matrix()
{
delete [] matrix;
}
Пока все хорошо, однако при установке значений в матрице у меня была ошибка.
void Matrix::SetValue(int a,int b,int c,double value)
{
int index = (a * asize) + (b * bsize) + c;
matrix[index] = value;
}
Ошибка в другой части кода, которая задала 'maxc', означала, что иногда индекс был больше размера матрицы, что я обнаружил, добавив check и throw.
void Matrix::SetValue(int a,int b,int c,double value)
{
int index = (a * asize) + (b * bsize) + c;
if (index >= matrixsize) throw;
matrix[index] = value;
}
Это приведет к доступу к памяти вне той, которая была выделена в конструкторе, и когда вызывается удаление, возникает ошибка EXC_BAD_ACCESS.Любопытно, что EXC_BAD_ACCESS не был вызван в Matrix :: SetValue во время выполнения, но я предполагаю, что ответ имеет какое-то отношение к тому, что нет проверки границ на смещения индекса массива по отношению к границам памяти менеджера кучи.Если кто-то может пролить свет на это, мне было бы очень интересно, но сейчас этот ответ предназначен для всех, кто находит этот ответ в веб-поиске.