Вопрос возникает после прочтения некоторых кодов, написанных другими разработчиками, поэтому я провел некоторое исследование, и я нашел статью Андрея Александреску. В своем article он говорит, что можно использовать энергонезависимую логическую переменную для активного ожидания (см первый пример с Wait/Wakeup)еще одна тема о volatile
class Gadget
{
public:
void Wait()
{
while (!flag_)
{
Sleep(1000); // sleeps for 1000 milliseconds
}
}
void Wakeup()
{
flag_ = true;
}
...
private:
bool flag_;
};
Я не очень понимаю, как это работает.
- volatile не гарантирует, что операции будут атомарными. Практически чтение/запись в логическую переменную являются атомарными, но теория не гарантирует этого. С моей точки зрения, приведенный выше код можно было бы безопасно переписать с помощью C++ 11, используя функции std :: atomic :: load/store с ограничениями порядка хранения/освобождения памяти соответственно.
- У нас нет этой проблемы в описанном примере, но если у нас есть более одной записи, у нас могут быть проблемы с упорядочением памяти. Volatile - это не забор, он не форсирует порядок памяти, а просто предотвращает оптимизацию компилятора.
Так почему же так много людей используют volatile bool для оживленного ожидания и действительно ли он переносится?
Я не авторитет в этой области, но мой инстинкт такой же, как ваш. Также может быть стоит отметить, что в вашем коде нет 'volatile bool';) Также возможно, что статья относится к 1 февраля 2001 года. –
[Возможный ответ] (http://stackoverflow.com/a/4168894/560648) по почти дублированному вопросу. –
Да, вы правы. Я скопировал исходный код из первого примера, он добавляет изменчивость позже. Позвольте мне это исправить. – axe