Lab4a 实验解析
tinyCoroLab4a 实验解析
git clone https://github.com/sakurs2/tinyCoro📖lab4a 任务参考实现
🧑💻Task #1 - 实现 event
std::atomic<awaiter_ptr> event_base::m_state{nullptr};class event_base
{
public:
struct awaiter_base
{
awaiter_base(context& ctx, event_base& e) noexcept : m_ctx(ctx), m_ev(e) {}
inline auto next() noexcept -> awaiter_base* { return m_next; }
auto await_ready() noexcept -> bool;
auto await_suspend(std::coroutine_handle<> handle) noexcept -> bool;
auto await_resume() noexcept -> void;
context& m_ctx; // 绑定的 context
event_base& m_ev; // 绑定的 event
awaiter_base* m_next{nullptr}; // 链表的 next 指针
std::coroutine_handle<> m_await_coro{nullptr}; // 待 resume 的协程句柄
};
event_base(bool initial_set = false) noexcept : m_state((initial_set) ? this : nullptr) {}
~event_base() noexcept = default;
event_base(const event_base&) = delete;
event_base(event_base&&) = delete;
event_base& operator=(const event_base&) = delete;
event_base& operator=(event_base&&) = delete;
// 判断 event 是否被 set,根据 m_state 是否等于 this
inline auto is_set() const noexcept -> bool { return m_state.load(std::memory_order_acquire) == this; }
auto set_state() noexcept -> void; // 设置 event,唤醒所有 suspend awaiter
auto resume_all_awaiter(awaiter_ptr waiter) noexcept -> void; // 唤醒所有 suspend awaiter
auto register_awaiter(awaiter_base* waiter) noexcept -> bool; // 挂载 suspend awaiter
private:
std::atomic<awaiter_ptr> m_state{nullptr};
};实验总结
Last updated