При записи в битовое поле может существовать временное окно, в котором любая попытка другого потока получить доступ (прочитать или записать) к любому (одинаковому или другому) битовому полю в той же структуре приведет к неопределенному поведению, Это означает, что все может случиться. При чтении битового поля может быть временное окно, когда любая попытка другого потока записать любое битовое поле в той же структуре приведет к неопределенному поведению.
Если вы практически не можете использовать отдельные переменные для рассматриваемых битовых полей, вы можете хранить несколько битовых полей в целых числах и обновлять их атомарно, создавая объединение между структурой битовых полей и 32-битной целое число, а затем с использованием последовательности CompareExchange:
- Считать значение битового поля как Int32.
- Преобразуйте его в структуру битового поля.
- Обновить структуру
- Преобразование структуры обратно в Int32.
- Используйте CompareExchange, чтобы перезаписать переменную новым значением, только если оно все еще содержит значение, считанное в (1); если значение изменилось, начните заново с шага (1).
Чтобы этот подход работал хорошо, шаги 2-4 должны быть быстрыми. Чем дольше они занимают, тем больше вероятность того, что CompareExchange на шаге 5 завершится неудачей, и, следовательно, чем больше шагов 2-4 придется выполнять повторно, прежде чем CompareExchange будет успешным.