Требуется ли барьер памяти для чтения атомарно модифицированного значения?C++

Программы на C++. Форум разработчиков
Anonymous
 Требуется ли барьер памяти для чтения атомарно модифицированного значения?

Сообщение Anonymous »

Учитывая следующее:

Код: Выделить всё

class Foo
{
public:
void Increment()
{
_InterlockedIncrement(&m_value); // OSIncrementAtomic
}

long GetValue()
{
return m_value;
}

private:
long m_value;
};
Требуется ли барьер памяти для чтения m_value? Насколько я понимаю, _InterlockedIncrement создаст полный барьер памяти, что гарантирует сохранение значения до того, как произойдут любые последующие загрузки. С этой точки зрения это звучит безопасно, но можно ли вообще кэшировать m_value, то есть может ли GetValue() возвращать устаревшее значение, даже при атомарном приращении?
Отличные статьи Джеффа Прешинга для справки: https://preshing.com/20120515/memory-re ... n-the-act/
Дополнительный контекст:
Я слежу за серией статей о программировании без блокировок и, в частности, рассматриваю использование переменной unfinishedJobs и потенциальную реализацию HasJobCompleted здесь:
https://blog.molecular-matters.com/2015 ... -1-basics/

Код: Выделить всё

void Wait(const Job* job)
{
// wait until the job has completed. in the meantime, work on any other job.
while (!HasJobCompleted(job))
{
Job* nextJob = GetJob();
if (nextJob)
{
Execute(nextJob);
}
}
}
Определить, завершено ли задание, можно путем сравнения незавершенных заданий с 0.

Итак, учитывая этот контекст, потребует ли возможная реализация HasJobCompleted барьер памяти?

Подробнее здесь: https://stackoverflow.com/questions/717 ... y-modified

Вернуться в «C++»