Привет, я пытаюсь понять реализацию блокировки кражи без блокировки работы.В настоящее время я читаю одну реализацию на филаменте Google здесь .Меня больше всего беспокоит операция перехвата.
template <typename TYPE, size_t COUNT>
TYPE WorkStealingDequeue<TYPE, COUNT>::steal() noexcept {
do {
// mTop must be read before mBottom
int32_t top = mTop.load(std::memory_order_seq_cst);
// mBottom is written concurrently to the read below in pop() or push(), so
// we need basic atomicity. Also makes sure that writes made in push()
// (prior to mBottom update) are visible.
int32_t bottom = mBottom.load(std::memory_order_acquire);
if (top >= bottom) {
// queue is empty
return TYPE();
}
// The queue isn't empty
TYPE item(getItemAt(top));
if (mTop.compare_exchange_strong(top, top + 1,
std::memory_order_seq_cst,
std::memory_order_relaxed)) {
// success: we stole a job, just return it.
return item;
}
// failure: the item we just tried to steal was pop()'ed under our feet,
// simply discard it; nothing to do.
} while (true);
}
Мне интересно, правильно ли заменить начальный порядок памяти mtop.load на memory_order_relaxed и последующий порядок памяти mBottom.load на memory_order_seq_cst.Это все равно должно сохранить порядок mtop.load и mBottom.load, верно?Флаг memory_order_seq_cst должен по-прежнему препятствовать переупорядочению memory_order_relaxed, чтобы пройти операцию загрузки, верно?