Попытка быть умной с моделью потоков без блокировки (барьеры, атомарность, операции с блокировкой и т. Д.) Для защиты более чем одной переменной вместо стандартного механизма блокировки приведет только к ошибкам.
Вам необходимо защитить все переменные (number1
, number2
и flag
) с помощью блокировки (критический раздел)
Тема A:
EnterCriticalSection(&cs);
flag = 1;
number1 = 12345;
number2 = 678910;
LeaveCriticalSection(&cs);
Тема B:
while (1)
{
int n1, n2;
EnterCriticalSection(&cs);
if (flag)
{
n1 = number1;
n2 = number2;
break;
}
LeaveCriticalSection(&cs);
}
printf("%d", n1);
printf("%d", n2);
Кроме того, в Windows вы можете избежать всего цикла while (flag == 0) {}
от записи ядра ЦП с помощью условной переменной .Переключение с механизма непрерывного опроса на механизм, основанный на уведомлениях, даст гораздо лучшие результаты производительности, чем попытки выполнить сложные операции с блокировкой.
Лучше:
Поток A:
EnterCriticalSection(&cs);
flag = 1;
number1 = 12345;
number2 = 678910;
LeaveCriticalSection(&cs);
WakeAllConditionVariable(&conditional_variable);
Резьба B:
EnterCriticalSection(&cs);
while (flag == 0)
{
// This will atomically Leave the CS and block until the conditional_variable is fired by the other thread
SleepConditionVariableCS(&conditional_variable, &cs, INFINITE);
// After it returns, it will re-enter the CS.
}
n1 = number1;
n2 = number2;
LeaveCriticalSection(&cs);
printf("%d", n1);
printf("%d", n2);