Структура RawWaker
Описание
RawWaker позволяет разработчику исполнителя задач создать Waker или LocalWaker, которые предоставляют кастомное поведение пробуждения.
Состоит из указателя данных и таблицы виртуальных функций (vtable), которая настраивает поведение RawWaker.
Использование RawWaker небезопасно. Реализация трейта Wake является безопасной альтернативой, но требует выделения памяти.
Синтаксис
#![allow(unused)] fn main() { pub struct RawWaker { /* приватные поля */ } }
Методы
new
#![allow(unused)] fn main() { pub const fn new(data: *const (), vtable: &'static RawWakerVTable) -> RawWaker }
Создает новый RawWaker из предоставленного указателя данных и vtable.
Доступность: 1.36.0 (const: 1.36.0)
Параметры
data- указатель на произвольные данные, требуемые исполнителемvtable- таблица виртуальных функций для настройки поведения
Безопасность
- Указатель данных должен указывать на потокобезопасный тип (например,
Arc<T: Send + Sync>) при созданииWaker - Это ограничение снимается при создании
LocalWaker, что позволяет использовать типы безSend + Sync(например,Rc<T>) - Vtable настраивает поведение
Waker, созданного изRawWaker
Реализации трейтов
From<Arc<W>> для RawWaker
#![allow(unused)] fn main() { impl<W> From<Arc<W>> for RawWaker where W: Wake + Send + Sync + 'static, }
Использует пробуждаемый тип как RawWaker.
Особенности:
- Не требует выделения памяти или атомарных операций
- Доступно только на платформах с
target_has_atomic=ptr
From<Rc<W>> для RawWaker
#![allow(unused)] fn main() { impl<W> From<Rc<W>> for RawWaker where W: LocalWake + 'static, }
Использует пробуждаемый тип как RawWaker.
Особенности:
- Не требует выделения памяти или атомарных операций
- Работает с типами, не реализующими
Send + Sync
Debug
#![allow(unused)] fn main() { impl Debug for RawWaker }
Позволяет форматирование RawWaker для отладки.
PartialEq
#![allow(unused)] fn main() { impl PartialEq for RawWaker }
Реализует проверку на равенство для RawWaker.
Автоматические реализации трейтов
Freeze for RawWaker- может быть замороженRefUnwindSafe for RawWaker- безопасен для паники!Send for RawWaker- не может быть передан между потоками!Sync for RawWaker- не может быть разделен между потокамиUnpin for RawWaker- может быть безопасно перемещеноUnwindSafe for RawWaker- безопасен для паники
Пример использования
#![allow(unused)] fn main() { use std::task::RawWaker; // Создание кастомного RawWaker let data: *const () = ...; let vtable: &RawWakerVTable = ...; let raw_waker = RawWaker::new(data, vtable); }
Назначение
RawWaker используется для:
- Создания кастомных исполнителей задач
- Реализации низкоуровневого поведения пробуждения
- Интеграции с внешними системами событий
Предупреждения
- Использование
RawWakerтребует небезопасного кода - Неправильная реализация может привести к неопределенному поведению
- Рекомендуется использовать безопасные альтернативы (
Wake,LocalWake) когда это возможно
Безопасность
При реализации RawWaker необходимо обеспечить:
- Корректность указателя данных
- Правильную реализацию vtable
- Потокобезопасность при использовании с
Waker - Корректное управление временем жизни данных