one loop per thread
11885 단어 muduo
muduo
에서 one loop per thread
는 하나의 라인에서 하나의 loop 순환이다.이 라인은
EventLoopThread
대상입니다. 이 순환은 구성원EventLoop
대상이 호출한loop() 순환입니다. 이 순환은 이벤트가 완성되기를 기다리고 각자의 이벤트 처리 함수로 나누어 줍니다.EventLoopThread
대상은 스레드 탱크EventLoopThreadPool
가 관리하고 각EventLoopThrea
d 대상은 EventLoop
의loop()
가 운행한다.호출
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;
}
이후 모든 대상
EventLoop
은 EventLoopThreadPool
의 구성원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;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
muduo 간단한 echo 서버 분석EchoServer에 TcpServer 형식의 조합 변수 server_가 있는 것을 보았습니다.(muduo가 파생적인 방식이 아니라 조합 방식을 제창하는 것에 주의), server_이 EventLoop 인스턴스가 참...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.