Является ли следующий поток кода C ++ безопасным? - PullRequest
1 голос
/ 31 января 2012

Является ли следующий

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);
}

потокобезопасным, учитывая:

  1. formattingPivots.GetNthBlckB(n), formattingPivots.GetNthInt(n + 1), formattingPivots.GetNthInt(n) и formattingPivots.GetCount() - все const методы.
  2. Я вызываю GetNthBlock () из 2 потоков, когда поток 1 вызывает и возвращает обычный блок. Я замечаю побочный эффект в потоке 2.
  3. 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.

Ответы [ 3 ]

3 голосов
/ 31 января 2012

Факт безопасности потока # 1: Если две функции f() и g() обе являются поточно-ориентированными, то следующая функция не обязательно является поточно-ориентированной:

// h might not be thread-safe!
void h()
{
    f(); // f is thread-safe
    g(); // g is thread-safe
}

Таким образом, вам придется доказать безопасность потоков, основываясь на содержимом функций GetNthBlckB, GetNthInt и т. Д. Я не знаю, что делают эти методы, поэтому я не знаю, являются ли они потокобезопасными илинет (const не имеет к этому никакого отношения).Это выглядит как будто оно не поточно-ориентированное для меня.

0 голосов
/ 11 февраля 2012

Отвечая на мой вопрос, я подумал, что кто-то другой уже сказал это:

Не думайте, что какая-либо библиотечная функция является поточно-ориентированной, если она не говорит, что это так.

Мои 98% предположения были неверны, и небезопасный поток-метод лежал в другом месте в методе экземпляра библиотеки с использованием полностью отдельных объектов, но вызывался из двух потоков. Должно быть, где-то там была статическая переменная, так как стек вызовов, где он будет падать (очень редко), выглядел глубоко внутри библиотечного кода.

0 голосов
/ 31 января 2012

Является ли Blocks.GetAt () неизменным методом (не меняет внутреннее состояние)?Может не быть, если он использует кеш для чтения из базы данных или из файла, например.

Кроме того, ответ на ваш вопрос также будет зависеть от того, когда данные были инициализированы.

Это перед тем, как будут созданы какие-либо потоки?

Кроме того, я рекомендую вам регулярно использовать drd и helgrind от valgrind в вашем проекте, чтобы помочь вам найти текущие ошибкиа также предотвращение попадания будущих ошибок потоков в ваш проект.

Последняя рекомендация

Последнее предложение, если вы сомневаетесь в безопасности потоков, вставьте свой собственный мьютекс.Если вы можете показать, что он работает нормально с мьютексом , вы можете изолировать ошибку / ложные предположения / критические разделы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...