#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
}
Я действительно сожалею об очень плохом выражении лица.