Барьеры памяти, не знаете, могу ли я использовать расслабленный?

Используя псевдокод, у меня есть два потока, которые одновременно пытаются получить доступ к одним и тем же данным:

Резьба1

DataBlock db = memoryLocationX.reserveBlock();

Резьба2

DataBlock anotherDB = memoryLocationX.reserveBlock();

а также reserveBlock() выполняет std :: exchange () в памяти, возвращая исходное значение и заменяя его пустым значением, поэтому только один поток может получить данные:

DataBlock reserveBlock(){
return DataBlock(_internalState.exchange(EMPTY_VALUE));
}

У меня вопрос, при каких обстоятельствах я могу использовать std::memory_order_relaxed в качестве второго аргумента exchange()? Все, что я пытаюсь гарантировать, — это то, что только один из потоков извлекает данные, хранящиеся в _internalState. Но это достигается уже с помощью exchange (), значит ли это, что я могу использовать std::memory_order_relaxed?

1

Решение

С std::memory_order_relaxed Вы не получаете никаких гарантий, только то, что не будет данных гонок. Это позволяет избежать неопределенного поведения, но есть несколько ситуаций, когда это действительно полезно (например, если вы можете гарантировать синхронизацию другими способами).

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

В конце концов, это, скорее всего, не будет быстрее, а код будет более сложным.

2

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


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