【 在 Algoquant 的大作中提到: 】
: 以下由ds生成:
: #include <iostream>
: #include <thread>
: ...................
// 将 context 投入线程池
pool.enqueue([this, ctx] { handleConnection(ctx); });
没必要嘛。线程epoll_wait就行了呀,得到了被激活的fd,就得到了相应的context。
而且,不能accept一个就投入一个,10000个accept,就投进去10000个,你那几个线程,吃得了那么多吗?
workers.emplace_back([this] {
while (true) {
std::function<void()> task;
{
std::unique_lock<std::mutex> lock(queueMutex);
condition.wait(lock, [this] { return stop || !tasks.empty(); });
这个condition.wait,似乎应该改成epoll_wait.,然后从激活的event里提取context。每次处理一个context。不需要每个线程的queue。
M个context,accept一个,丢到epoll里一个。N个线程一起epoll_wait,谁逮到哪个context处理哪个。
context在各个线程间游走。
我管这个叫做:抛绣球模型,context就是绣球,线程是工人,epoll是流水线,工人接到一个绣球就处理,处理到需要IO就抛进流水线。所以,context里有一个callback,用于支持抛绣球模型。同时里边也有一个ucontext用于支持协程。线程得到context后先看有没有callback,有就调用。否则看看是否异步IO,是就resume。再看是否新请求,如果是新请求,就建立协程然后在协程里进入工作函数。啥都不是就直接进入工作函数。
你用ds给的程序没看到协程。
--
修改:ylh1969 FROM 221.218.60.*
FROM 221.218.60.*