one loop per thread

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;
}

之后所有的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;
}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这个问题可以通过将主线程加入主循环来解决。可以使用事件循环机制来实现,例如使用 asyncio 库中的 run_until_complete() 函数。另外,也可以使用 Qt 框架中的 QEventLoop 类来实现。具体的实现方法需要根据具体的代码情况来确定。 ### 回答2: "main thread is not in main loop" 是一个错误消息,通常在编程中使用多线程或多进程的情况下出现。它表示主线程没有在主循环中运行,可能是由于一些错误或逻辑问题造成的。 要解决这个问题,我们可以采取以下步骤: 1. 检查代码逻辑:首先,确保代码中没有错误。检查是否有意外的跳出主循环的语句或逻辑错误。请确认程序流程是否正确,且没有意外的退出或退出循环的情况。 2. 确保主线程在主循环中运行:确认主线程是在主循环中运行的。主循环是一个应用程序的核心部分,负责处理用户输入,事件和其他任务。确保代码中没有在主线程外执行的操作。 3. 使用正确的多线程或多进程机制:如果需要使用多线程或多进程,确保使用正确的机制。例如,在Python中,可以使用threading和multiprocessing模块来实现这些功能。确保将主线程放在主循环中运行,并正确管理其他线程或进程。 4. 使用同步机制:如果涉及共享数据或同时访问关键资源的情况,确保使用适当的同步机制。例如,使用锁或线程安全的数据结构来避免竞争条件和数据不一致问题。 5. 参考文档和示例代码:如果以上方法仍然无法解决问题,建议参考相关文档和示例代码。对于特定语言和框架,通常会有详细的说明和示例,可以帮助理解并解决此问题。 最后,解决"main thread is not in main loop"问题需要仔细分析代码,确保所有的线程和进程都正确地在主循环中运行,并且使用适当的同步机制来保证程序的正确性。 ### 回答3: 解决 "main thread is not in main loop" 的问题的方法取决于出现此错误的具体情况。一般来说,这个错误意味着主线程(main thread)没有在主循环(main loop)中。以下是几种可能的解决方法: 1. 检查代码:仔细检查代码,确保所有与主线程有关的操作都在主循环中执行。主线程通常用于处理用户交互和应用程序逻辑,而主循环负责处理事件和更新UI。如果有操作没有放在主循环中,可以将其移动到适当的位置。 2. 使用合适的线程:如果有其他线程在执行操作,确保它们不会影响主线程的运行。可以使用线程同步机制,如锁或条件变量,来协调不同线程之间的操作,以确保主线程的正常运行。 3. 检查库或框架:如果错误是在使用某个库或框架时出现的,建议查阅相关文档或寻求社区支持。库或框架的作者通常会提供解决此类错误的具体建议或修复方法。 4. 更新软件版本:如果错误是由软件版本不兼容或存在已知错误导致的,可以尝试更新软件版本。这样可以获得已修复的错误和改进的功能,从而解决问题。 5. 寻求专业帮助:如果无法解决问题,建议联系相关领域的专业人员寻求帮助。他们可能会针对具体情况提供更具体的解决方法。 值得注意的是,由于缺乏具体的背景信息,这些解决方法可能并不适用于所有情况。因此,理解问题的具体背景和原因是解决问题的关键。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值