Является ли следующий
int BlkArray::GetNthBlockA(unsigned int n, const Block *&pfb, int &maxIndex) const {
if (n + 1 >= (unsigned int)formattingPivots.GetCount()) return -1;
pfb = formattingPivots.GetNthBlckB(n);
maxIndex = formattingPivots.GetNthInt(n + 1) - 1;
return formattingPivots.GetNthInt(n);
}
потокобезопасным, учитывая:
formattingPivots.GetNthBlckB(n)
, formattingPivots.GetNthInt(n + 1)
, formattingPivots.GetNthInt(n)
и formattingPivots.GetCount()
- все const
методы. - Я вызываю GetNthBlock () из 2 потоков, когда поток 1 вызывает и возвращает обычный блок. Я замечаю побочный эффект в потоке 2.
const Блок * & pfb передается следующим образом:рабочий метод потока:
int maxIndex;
const Block *pfb = null;
pStoredBlcks->GetNthBlockA(blockBreakIndex, pfb, maxIndex);
Меня беспокоит const
может вызывать непреднамеренный эффект при сохранении между телами обоих рабочих.У меня 98% ошибок, которые я получаю из приведенного выше кода, но, учитывая многопоточность, я не могу быть намного увереннее.
Я приближаюсь к пределу моих вопросов в течение 24 часов, и еще одинвещь, если это могло бы помочь.static_cast<>
поток безопасен?(Глупо? Да, но я писал C годами) Я спрашиваю из-за:
const Block *GetNthblckB(int n) const {
return static_cast<const Block*>(Blocks.GetAt(n));//Returns `Object`* without cast.
}
3am_ _ _ Спасибо за поддержку, ребята.Я просто окружил этот вызов CritSecMonitor, и у меня все еще есть побочный эффект.Если не считать руководства по valgrind, мне лучше поймать несколько zz.