Требуется ли Mutex для 1-байтовой общей памяти

мой случай - это один поток, который прочитал и хочет решить, нужно ли изменить значение или нет?

что-то вроде ниже

void set(bool status)
{ 
    if(status == m_status)
         return;
     monitor.lock();
     m_status = status;

}

если это возможно?

Ответ 1

Использование объекта синхронизации для логического состояния является излишним.

В Windows вы можете использовать Доступ к блокированным переменным.

Для кросс-платформенного решения.. см. Boost Atomic

std::atomic из С++ 11 также является решением

Ответ 2

Думаю, вам нужно немного уточнить свой вопрос. Является ли это возможным? Да. Это необходимо? Вероятно. Есть ли другие способы сделать это? Да, как отметил еще один ответ.

Не забывайте разблокировать, когда закончите с вещами, которые вы хотите изменить. И просто стилистическое замечание, я нахожу гораздо более ясным использование вашего оператора "if" для блокировки блока кода вместо возврата из функции. Вот так:

void set(bool status)
{ 
    if(status != m_status)
    {
        monitor.lock();
        m_status = status;
        monitor.unlock();
    }
}

Просто мое мнение, конечно.

Ответ 3

Вообще это невозможно. Он будет работать большую часть времени на большинстве платформ, но формально undefined, и есть случаи, когда проблемы согласованности кэша придут на вас.

Если вы можете получить С++ 11, используйте std::atomic<bool> из нового заголовка <atomic>. Если нет, вы должны использовать эквивалент эквивалентного компилятора. У Windows есть функции Interlocked *, GCC имеет ключевое слово __sync. На самом деле существует кросс-платформенная реализация важных битов стандарта С++ 11, глубоко погруженных в библиотеку Boost.Interprocess, но, к сожалению, она не отображается пользователю.