【发布时间】:2013-12-06 14:25:25
【问题描述】:
我正在尝试使用 libevent 完成一个简单的 HTTP 服务器,并根据文档示例设法完成它。然而,没有线程,libevent 的全部目的就是垃圾。我对 C++11 中的线程不是很有经验,但我很想知道如何正确实现这样的服务器。
我在网上找到了这个例子:https://gist.github.com/kzk/665437
这是正确的吗? pthreads 是正确的选择吗?另外,这条线很奇怪:
for (int i = 0; i < nthreads; i++) {
pthread_join(ths[i], NULL);
}
那里发生了什么?
【问题讨论】:
-
您应该阅读如何处理多个客户的策略。每个客户端一个线程可能不是最佳的。 kegel.com/c10k.html#strategies
-
另外,如果你想使用线程并且你正在使用 C++11,你可以看看这里:en.cppreference.com/w/cpp/thread/thread。
-
"那里发生了什么?" -- 这 3 行加入线程而不关心它们的退出代码。换句话说,服务器主进程一直等到它们全部完成。
-
那么,上面的代码并没有真正的可扩展性,是吗?
-
实际上gist.github.com/kzk/665437 中的代码在可扩展性方面相当不错:它使用有限数量的线程和 libevent 实例(每个线程一个)以便更好地利用 CPU,而每个 libevent 实例都是异步的维护来自 HTTP 客户端的大量连接。类似于 libevhtp 对 evthr 所做的事情。