172 похожих чатов

Всем привет! Вопрос по мемори ордерингам. Есть 2 треда, на

втором работает tokio с асинк циклом. В конце работы - первый тред ставит флаг exit и вызывает wake, чтобы футура во втором треде проснулась:
self.exit.store(true, Ordering::Relaxed);
self.waker.lock().unwrap().wake();
Во втором треде при получении wake() футура успешно завершается, после чего проверяется флаг exit и происходит выход:
pending_future.await; // гарантировано ожидаем wake тут
if self.exit.load(Ordering::Relaxed) {
return;
}
Вопрос вот в чем. exit - атомарный булиан, никаких операций кроме единичной записи перед wake() и чтения во втором треде после wake() нет. Возможна ли следующая последовательность исполнения на x86-64 или arm64 с relaxed мемори ордерингом?:
thread1: wake() - thread2: awaken - thread2:reads exit false - thread1: writes exit true

6 ответов

23 просмотра
⁣Денис-Давыдов Автор вопроса

Как бы с одной стороны модификейшн ордер для exit: false, true и ничто не мешает второму треду получить из кэша false. Но с другой стороны в первом треде все-таки запись происходит до wake, а wake еще и под мьютексом - не вызовет ли что-то там все-таки какую-то синхронизацию кэшей?

⁣Денис-Давыдов Автор вопроса
⁣Денис Давыдов
Как бы с одной стороны модификейшн ордер для exit:...

Похоже да, wake() у себя внутри вызывает compare_exchange c AcqRel, который обещает что все записи в память от треда 1 до этого будут видны треду 2. Точно ли я ничего не путаю?

А через что ты будишь токио тред?

⁣Денис-Давыдов Автор вопроса
Nano
А через что ты будишь токио тред?

Просто waker из контекста. impl Future for PendingFuture { type Output = (); fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> { let me = self.get_mut(); // ... тут проверки не готова ли футура me.waker.lock().replace(cx.waker().clone()); Poll::Pending } }

⁣Денис-Давыдов Автор вопроса
Nano
А через что ты будишь токио тред?

Собственно проверил loomом: #[cfg(test)] mod atomic_tests { use loom::sync::atomic::AtomicBool; use loom::sync::atomic::Ordering; use loom::thread; use loom::thread::yield_now; #[test] fn test_sync() { loom::model(|| { let exit: &'static _ = Box::leak(Box::new(AtomicBool::new(false))); let wake: &'static _ = Box::leak(Box::new(AtomicBool::new(false))); let b= thread::spawn(move || { while !wake.load(Ordering::Acquire) { yield_now(); }; assert!(exit.load(Ordering::Relaxed)); }); exit.store(true, Ordering::Relaxed); // wake() в tokio под капотом: // https://github.com/tokio-rs/tokio/blob/master/tokio/src/runtime/task/state.rs#L215 // https://github.com/tokio-rs/tokio/blob/master/tokio/src/runtime/task/state.rs#L467 assert!(wake.compare_exchange(false, true, Ordering::AcqRel, Ordering::Acquire).is_ok()); b.join().unwrap(); }) } }

⁣Денис Давыдов
Похоже да, wake() у себя внутри вызывает compare_e...

Должно. Если глянуть в реализацию мьютексов, там там данные которые он охраняет даже не в атомике лежат и работает)

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта