CBUS: 100% загрузка треда при отправке в полный канал
Пример:
let (tx, rx) = cbus::sync::std::channel(CBUS_ENDPOINT, usize::try_from(100)?.try_into()?);
let pool = ThreadPool::new(1);
pool.execute(move || loop {
if let Err(err) = tx.send(1) {
error!("error in send: {err}");
break;
}
});
let mut counter = 0;
loop {
rx.receive()?;
counter += 1;
if counter >= 10 {
error!("sleep tx");
thread::sleep(std::time::Duration::from_secs(10));
counter = 0;
}
}
имеем канал с очередью на 100 сообщений запускаем тред (пусть в данном случае тред пулл), в котором будем отправлять сообщения из tx треда вычитываем сообщения и через каждые 10 сообщений засыпаем
в моменты засыпания tx можем наблюдать как тред начинает расходовать 100% CPU.
почему это происходит?
в самой реализации метода send
есть проверка на self.thread_waker.wait
, но она работает только до тех пор пока не произошло первое чтение из канала (receive
при первом же вызове выставит флаг is_started
)
иначе сообщение будет крутить в loop, в попытках поставиться в очередь
что хотелось бы видеть?
send
умеет засыпать если не может поставить сообщение в очередь
Edited by Alexandr Sorokin