Должен ли я всегда заботиться об атомарности при назначении значений в многопоточных проектах? У меня два потока работают параллельно. Могу ли я безопасно изменить переменную не-DWORD, если она используется только как флаг? Или я должен использовать переменную с выравниванием DWORD (или сам DWORD), так как Microsoft гарантирует, что она будет изменена атомарно? Или я должен замедлить мой код и использовать вместо этого функции Interlocked * ()? Будет ли мой код работать нормально, если я перейду с 32-битной системы на 32-х или 64-битную?
/* real value doesn't matter, only null or not-null */
short flag;
// DWORD flag;
DWORD WINAPI thread_1(LPVOID* param)
{
while(true){/* do stuff, flag can be changed non-atomically */}
return 0;
}
DWORD WINAPI thread_2(LPVOID* param)
{
while(true){if(flag){/* do stuff */}}
return 0;
}
Обновить
thread_2
только наблюдает за флагом в то время как thread_1
меняет это.
Вы должны использовать использовать Interlocked*
функции или (еще лучше) C ++ 11 атомика.
Других решений пока нет …