Я использую библиотеку C, которая предоставляет API для вызова предоставляемой пользователем функции в потоке, созданном этой библиотекой C.Я не могу обработать события внутри обратного вызова, потому что он не должен блокировать поток, поэтому я хочу каким-то образом сообщить циклу событий Tokio, что мой обратный вызов был вызван.
Как я могу это сделать?
Точнее у меня есть:
fn register_callback_to_run_inside_c_thread<F>(callback_f: F)
where
F: FnMut() + Send + UnwindSafe + 'static,
{
unimplemented!();
}
Я хочу передать закрытие внутри register_callback_to_run_inside_c_thread
, чтобы проинформировать Токио о событии.
Сначала я попытался:
let (mut tx, rx) = watch::channel("hello");
register_callback_to_run_inside_c_thread(move || {
tx.broadcast("world").unwrap();
});
Этот код не компилируется, потому что он использует RefCell
где-то внутри.
Я также пытался использовать lazy
для запуска функции внутри Tokio.Этот код компилируется, но падает во время выполнения, потому что lazy
должен выполняться внутри потоков, созданных Tokio, но обратный вызов выполняется внутри потока, созданного библиотекой C.
Есть ли способ сообщить Tokio о событии?