Рассмотрим:Ложное разделение охраняемых переменных-членов?
class Vector
{
double x, y, z;
// …
};
class Object
{
Vector Vec1, Vec2;
std::mutex Mtx1, Mtx2;
void ModifyVec1() { std::lock_guard Lock(Mtx1); /* … */ }
void ModifyVec2() { std::lock_guard Lock(Mtx2); /* … */ }
};
Если либо мьютексы или охраняемом переменные хранятся смежно и они делят строку кэша при кэшировании, это может привести к своего рода «перекрестного блокирования»?
Если да, то целесообразно ли объявлять мьютексы сразу после (или до) переменной, которую они охраняют?
Выравнивание класса до std::hardware_destructive_interference_size
(P0154) может избежать этого эффекта. Возможны ли потенциальные выгоды для переоценки объекта?
Стандарт C++ не требует, чтобы классы были выложены в любом конкретном порядке (с некоторыми оговорками, которые здесь не применимы). Вы можете определить из документации вашего компилятора, использует ли он детерминированный порядок для членов класса (вероятно). –
@SamVarshavchik Для класса стандартного макета они должны быть в порядке декларации и в зависимости от того, что опубликовано до сих пор, это может быть стандартный класс макета. Также это не имеет особого значения, поскольку OP задает вопрос о деталях конкретных реализаций –
@ Rakete1111 Пожалуйста, не стесняйтесь редактировать – metalfox