Неатомарное назначение в многопоточных приложениях

Должен ли я всегда заботиться об атомарности при назначении значений в многопоточных проектах? У меня два потока работают параллельно. Могу ли я безопасно изменить переменную не-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 меняет это.

1

Решение

Вы должны использовать использовать Interlocked* функции или (еще лучше) C ++ 11 атомика.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector