Skip to content

Latest commit

 

History

History
60 lines (39 loc) · 3.34 KB

eventloop.zh-cn.md

File metadata and controls

60 lines (39 loc) · 3.34 KB

概述

EventLoop用于socket的读写检测,以及线程间通信.

源码见:EventLoop.hppEventLoop不是必须使用智能指针,可以使用值对象,当然它也是禁止拷贝的。

接口

  • EventLoop::loop(int64_t milliseconds)

    进行一次轮询,milliseconds为超时时间(毫秒).
    也即当没有任何外部事件产生时,此函数等待milliseconds毫秒后返回.
    当有事件产生时,做完工作后即可返回,所需时间依负荷而定.
    通常,我们会开启一个线程,在其中间断性的调用loop接口。

  • EventLoop::bindCurrentThread

    初始化调度EventLoop的thread id,用于使用EventLoop接口时时判断当前线程是否处于EventLoop::loop所在线程。在使用EventLoop的一些函数,比如runAsyncFunctor时,都需要执行bindCurrentThread(当然,你也可以直接调用loop来初始化)

  • EventLoop::wakeup(void)

    (线程安全)唤醒可能阻塞在EventLoop::loop中的等待。
    (当然,当EventLoop没有处于等待时,wakeup不会做任何事情,即没有额外开销)
    另外! 此函数永远成功。其返回值仅仅表示函数内部是否真正触发了唤醒所需的函数。

  • EventLoop::runAsyncFunctor(std::function<void(void)>)

    (线程安全)投递一个异步函数给EventLoop,此函数会在EventLoop::loop调用中被执行。如果此时EventLoop还没有初始化thread id(通过bindCurrentThread或loop),那么此函数会抛出异常,避免用户忘记调度IO工作线程时就投递了任务而导致逻辑错误。

  • EventLoop::runFunctorAfterLoop(std::function<void(void)>)

    EventLoop::loop所在线程中投递一个延迟函数,此函数会在loop接口中的末尾(也即函数返回之前)时被调用。
    此函数只能在io线程(也就是调用loop函数的所在线程)使用,如果在其他线程中调用此函数会产生异常。

  • EventLoop::isInLoopThread(void)

    (线程安全)检测当前线程是否和 EventLoop::loop所在线程(也就是最先调用loop接口的线程)一样。

  • `brynet::base::Timer::WeakPtr EventLoop::runAfter(std::chrono::nanoseconds timeout, std::function<void(void)>&& callback)

    开启一个延迟执行的函数,当到期时会在EventLoop工作线程(即loop函数所在线程)里执行callback。可通过返回的brynet::base::Timer::WeakPtr的cancel函数来取消定时器。

  • RepeatTimer::Ptr EventLoop::brynet::base::RepeatTimer::Ptr runIntervalTimer(std::chrono::nanoseconds timeout, std::function<void(void)>&& callback)

    开启一个重复执行的延迟执行的函数,当每次到期时会在EventLoop工作线程(即loop函数所在线程)里执行callback。可通过返回的RepeatTimer::Ptr的cancel函数来取消定时器。

注意事项

  • 当我们第一次在某个线程中调用loop之后,就不应该在其他线程中调用loop(当然如果你调用了,也没有任何效果/影响)
  • 如果没有任何线程调用loop,那么使用pushAsyncProc投递的异步函数将不会被执行,直到有线程调用了loop接口,这些异步函数才会被执行。

示例

EventLoop ev;
ev.runAsyncFunctor([] {
    	std::cout << "hello world" << std::endl;
	});
ev.loop(1);

// output hello world