предупреждение C28112: Переменная, доступ к которой осуществляется с помощью Заблокированной функции, всегда должна быть доступна с помощью заблокированной функции

#multithreading #synchronization #warnings #interlocked

Вопрос:

Я получаю это «предупреждение C28112: Переменная, доступ к которой осуществляется через заблокированную функцию, всегда должна быть доступна через заблокированную функцию». при передаче адреса общей переменной, доступ к которой осуществляется через заблокированные функции, в WakeByAddressSingle.

Я понимаю смысл предложения «Переменная, доступ к которой осуществляется через заблокированную функцию, всегда должна быть доступна через заблокированную функцию».

И мой вопрос в том, как же мне использовать эту переменную, доступ к которой осуществляется заблокированными функциями?

Ситуация складывается следующим образом.

Есть два потока 0 и 1. Поток 0 ожидает или начинается, когда поток 1 подает сигнал. То, что я пытаюсь сделать, это использовать WaitOnAddress вместо WaitForSingleObject.

Это были рекомендации.

https://devblogs.microsoft.com/oldnewthing/20160823-00/?p=94145

https://devblogs.microsoft.com/oldnewthing/20170615-00/?p=96396

 short g_sSharedVariable = 0i16;
short g_sCompare = 0i16;
 

Поток 0

 while (true)
{
    int nWaitResult = WaitOnAddress(amp;g_sSharedVariable, amp;g_sCompare, sizeof(short), INFINITE);
    ...
}
 

Нить 1

 while (true)
{
    ...
    sReturn = InterlockedExchange16(amp;g_sSharedVariable, 1i16);
    WakeByAddressSingle(amp;g_sSharedVariable);  // warning C28112
}
 

Я действительно сожалею об очень плохом выражении лица.