one loop per thread

11885 단어 muduo
muduo에서 one loop per thread는 하나의 라인에서 하나의 loop 순환이다.
이 라인은 EventLoopThread 대상입니다. 이 순환은 구성원EventLoop 대상이 호출한loop() 순환입니다. 이 순환은 이벤트가 완성되기를 기다리고 각자의 이벤트 처리 함수로 나누어 줍니다.EventLoopThread 대상은 스레드 탱크EventLoopThreadPool가 관리하고 각EventLoopThread 대상은 EventLooploop()가 운행한다.
호출 void EventLoopThreadPool::start(const ThreadInitCallback& cb) 을 사용하여 라인을 만들고 이벤트 순환을 실행합니다.
void EventLoopThreadPool::start(const ThreadInitCallback& cb)
{
	assert(!started_);
	baseLoop_->assertInLoopThread();

	started_ = true;

	for (int i = 0; i < numThreads_; ++i)
	{
		char buf[name_.size() + 32];
		snprintf(buf, sizeof buf, "%s%d", name_.c_str(), i);
		EventLoopThread* t = new EventLoopThread(cb, buf);
		threads_.push_back(std::unique_ptr<EventLoopThread>(t));
		loops_.push_back(t->startLoop());
	}
	if (numThreads_ == 0 && cb)
	{
		cb(baseLoop_);
	}
}
t->startLoop()에서 thread_.start()가 스레드를 시작합니다. 이 스레드 함수는 EventLoopThread::threadFunc()입니다.EventLoop* EventLoopThread::startLoop()loop을 되돌려야 하지만 서브라인에서 loop_에 대한 할당이 완료되기를 기다려야 합니다.그래서 기다려야 한다cond_.wait();서브라인loop_의 할당이 완료되면 즉시 통지cond_.notify();
EventLoop* EventLoopThread::startLoop()
{
	assert(!thread_.started());
	thread_.start();

	EventLoop* loop = NULL;
	{
		MutexLockGuard lock(mutex_);
		while (loop_ == NULL)
		{
			cond_.wait();
		}
		loop = loop_;
	}

	return loop;
}
void EventLoopThread::threadFunc()
{
  EventLoop loop;

  if (callback_)
  {
    callback_(&loop);
  }

  {
    MutexLockGuard lock(mutex_);
    loop_ = &loop; // 
    cond_.notify();
  }

  loop.loop();
  //assert(exiting_);
  MutexLockGuard lock(mutex_);
  loop_ = NULL;
}


이후 모든 대상EventLoopEventLoopThreadPool의 구성원loops_에 저장된다.EventLoop 대상을 얻어야 할 때 호출EventLoop* EventLoopThreadPool::getNextLoop()을 사용하면 간단한 Round Robin 스케줄링 알고리즘을 사용합니다.
EventLoop* EventLoopThreadPool::getNextLoop()
{
	baseLoop_->assertInLoopThread();
	assert(started_);
	EventLoop* loop = baseLoop_;

	if (!loops_.empty())
	{
		// round-robin
		loop = loops_[next_];
		++next_;
		if (implicit_cast<size_t>(next_) >= loops_.size())
		{
			next_ = 0;
		}
	}
	return loop;
}

좋은 웹페이지 즐겨찾기