Проблема в том, что каждая из этих строк имеет смысл для компилятора.В них нет ничего неправильного , и просто комбинация не очень хороша.Даже тогда потребовалось бы значительное количество дополнительной работы и анализа, чтобы определить, что это неправильное использование.
Рассмотрим, например, что вы можете присоединиться к рабочему потоку в той же функции, и тогда все будетПравильно, если функция не обрабатывала в другом потоке, а просто манипулировала кодом в вызове SubmitWork
, это было бы правильно ... и компилятору не обязательно знать о потоков , поэтомуДело в том, что компилятору почти невозможно обнаружить это.
С другой стороны, это то, что должно быть совершенно очевидно для рецензента, поэтому его можно лучше решить, просматривая код.Другими возможными вариантами было бы использование некоторой формы совместного владения ресурсами для обработки ресурсов, что может означать более высокую стоимость:
void Execute ProcessWork {
std::shared_ptr<int> nRes = std::make_shared<int>( 0 );
CFireProcessMessageWork *pProcessMessageWork = new CFireProcessMessageWork();
pProcessMessageWork->m_pStatus = nRes; // copies the shared_ptr
m_pMessageWorkerAgency->SubmitWork(pProcessMessageWork);
}
В этом случае общее владение владением объектом настоимость дополнительного выделения гарантирует, что поток не будет вызывать неопределенное поведение при обновлении состояния.Но хотя это и сделает программу корректной с языковой точки зрения, это все равно может быть нежелательным: статус не будет читаемым вне рабочего потока, поскольку единственной другой ссылкой является снаружи рабочего контроля.