Вам нужно только отделить определение переменной от доступа для записи, который нуждается в защите, тем более что часть, которая записывает влево (по вашему собственному утверждению), не имеет значения.
Чтобы убедиться, что переменная не получает значения из-за несогласованного чтения, достаточно выполнить чтение внутри блокировки, что, в свою очередь, не нужно при инициализации, что и раздражало компилятор.
Итак:
int some_function()
{
/* ... */
int nonconst = 0; /* no declaration is after statement */
lock ( ...)
nonconst = test_variable[INDEX]; /* only assignment, no declaration */
/* ... */
{ /* start a new block to solve the compilers sequence complaint */
const int var = nonconst; /* var itself is const */
/* ... */
/* var being used sometime later, no code can change var */
/* changing the nonconst variable is possible, but does not affect
the value of var anymore */
/* ... */
}
unlock(...)
}
Выше приведен мой ответ. Ниже приведен более элегантный вариант, который, как я понимаю, был получен О.П. из проницательного комментария Адриана Моль (который я слепо пропустил ...) и структура моего ответа. Если Адриан или ОП сделают свой ответ и уведомят меня, я удалю эту часть. В настоящее время он улучшает этот ответ для блага других.
int some_function()
{
/* ... */
lock ( ...);
{ /* start a new block to solve the compilers sequence complaint */
const int var = test_variable[INDEX]; /* var itself is const */
/* ... */
/* var being used sometime later, no code can change var */
/* ... */
}
unlock(...);
}
Я сделал несколько небольших изменений, чтобы немного уменьшить путаницу и предупреждения компилятора.