инициализация константной переменной внутри блокировки - PullRequest
1 голос
/ 10 марта 2020

Мне нужно защитить присвоение или инициализацию переменной const с помощью блокировки. Примерно так:

int device_write() {
/* ... */
lock (lock);
const int var = test_variable[INDEX];
/* ... */


...
/* var being used here sometime later*/

unlock(lock)
...
}

Но теперь компилятор начинает предупреждать, что объявление после оператора. Поскольку объявление const int var = .. находится ниже spin_lock ().

Переменная var не является глобальной переменной.

На самом деле правая часть назначения довольно велика в реальном коде. Итак, вы хотите захватить это сначала в переменной с именем var и использовать его позже в сложном выражении, включающем var с различными битовыми операциями. Это требование. Не могу изменить, что

В основном с правой стороны задания test_variable[..] уязвим для состояния гонки из-за параллелизма / многопоточности. Следовательно, блокировка () необходима для защиты. Есть ли какой-нибудь другой элегантный способ добиться этого?

1 Ответ

3 голосов
/ 10 марта 2020

Вам нужно только отделить определение переменной от доступа для записи, который нуждается в защите, тем более что часть, которая записывает влево (по вашему собственному утверждению), не имеет значения.
Чтобы убедиться, что переменная не получает значения из-за несогласованного чтения, достаточно выполнить чтение внутри блокировки, что, в свою очередь, не нужно при инициализации, что и раздражало компилятор.

Итак:

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

Я сделал несколько небольших изменений, чтобы немного уменьшить путаницу и предупреждения компилятора.

...