我很难相信这个问题没有答案或教程,但我很难在任何地方找到答案或教程!
我必须(并且已经)构建一个多线程服务器来处理 C 中的 GET 请求。 对于满分,这需要使用线程池。目前我的主线程接受连接并将它们传递给新线程。
我可以在网上找到一些用 C 语言实现的线程池,但事实证明,来自 Java 背景的人理解它们很困难。他们似乎都使用任务队列。
考虑到您可以告诉队列连接的监听调用,这似乎是不必要的。 我在某个地方看到accept是线程安全的(据说我也听说POSIX说安全它更安全?) 这是一个明智的做法吗?或者每个线程等待接受而不是停止执行直到通过连接,开销会更高吗?
如果是这种情况,我将如何在 C 中执行此操作?我想我需要保留一个线程安全的数据结构,存储指向每个线程的指针和一个指示它们是否忙的值? 有某种方法可以重新启动线程并向其传递连接吗?但我不知道如何做到这一点,并且在互联网上找不到任何简单的教程。
任何建议或教程链接将不胜感激!
谢谢
最佳答案
Accept()
是 thread-safe .
实际上,您所描述的是一种使用线程池实现套接字服务器的优雅方法 - 在所有线程中调用 accept()
,并且操作系统将在以下情况下仅负责唤醒一个线程:连接到达。干得好,当我必须实现这些事情时,我从未真正考虑过这个选项。
据我所知,同时在多个线程中调用 accept()
并没有真正的开销 - 所有线程都会休眠,直到可以接受连接,因此它们不会有效地消耗任何 CPU 时间。
关于创建 pthreads 线程池来处理 get 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15033376/