【问题标题】:Creating a pthreads thread pool to handle get requests创建一个 pthreads 线程池来处理 get 请求
【发布时间】:2013-02-08 14:43:45
【问题描述】:

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

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

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

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

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

非常感谢任何建议或教程链接!

谢谢

【问题讨论】:

    标签: c networking pthreads threadpool


    【解决方案1】:

    Accept()thread-safe

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

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

    【讨论】:

    • 您有支持您的主张的文件吗?
    • 哪个声明?没有显着的开销?这似乎是合乎逻辑的,因为线程正在休眠,在 accept() 中等待。
    • 不,accept 将阻塞所有线程,并仅将 1 个唯一文件描述符返回给 1 个线程。
    • 刚刚快速浏览了net/ipv4/inet_connection_sock.c。但是,如果您查看手册页,其中没有提到 1.accept() 不是线程安全或可重入的(似乎很明显,因为 POSIX 要求它是线程安全的) 2.任何返回错误代码指示可能的竞争条件。
    • 谢谢。除了对 SIGPIPE 的错误处理之外,现在一切都在工作:)
    猜你喜欢
    • 2015-03-27
    • 2018-07-19
    • 1970-01-01
    • 2017-05-09
    • 1970-01-01
    • 1970-01-01
    • 2021-06-07
    • 2014-11-16
    • 2010-12-15
    相关资源
    最近更新 更多