2

我很难相信没有答案或教程,但我很难在任何地方找到一个!

我必须(并且必须)构建一个多线程服务器来处理 C 中的 GET 请求。要获得满分,这需要使用线程池。目前我的主线程接受连接并将它们传递给一个新线程。

我可以在网上找到一些用 c 语言实现的线程池,但是来自 Java 背景的人很难理解它们。他们似乎也都使用任务队列。

考虑到您可以将侦听呼叫告知队列连接,这似乎没有必要。我在某处看到接受是线程安全的(说我也听到 POSIX 说安全它更安全?)这是一种明智的做法吗?或者每个线程等待接受而不是在通过连接之前停止执行,开销会更高吗?

如果是这种情况,我将如何在 C 中执行此操作?我想我需要保持一个线程安全的数据结构,存储指向每个线程的指针和一个指示它们是否忙的值?并且有一些方法可以重新启动线程并传递一个连接?但我不知道如何做到这一点,也无法在互联网上找到任何简单的教程。

任何建议或教程链接将不胜感激!

谢谢

4

1 回答 1

2

Accept()线程安全的

实际上,您所描述的是一种使用线程池实现套接字服务器的优雅方式 - 调用accept()所有线程池,操作系统将在连接到达时只唤醒一个线程。干得好,当我不得不实施这样的事情时,我从来没有真正考虑过这个选项。

据我所知,同时调用多个线程并没有真正的开销accept()——所有线程都会休眠,直到可以接受连接,所以它们不会有效地消耗任何 CPU 时间。

于 2013-02-24T11:33:45.323 回答