【问题标题】:Multi threaded program: waiting on input多线程程序:等待输入
【发布时间】:2011-11-27 20:15:47
【问题描述】:

我们正在创建一个点对点程序(在 c 中),并且我们正在使用多个线程,以便该程序可以侦听新连接并接收/发送数据。

问题是,我记得我的教授告诉我们,如果你有多个线程在同一个进程上运行,如果一个必须等​​待用户输入,整个进程就会“停止”,所以其他线程都不会继续运行.

但是我们一直在阅读,似乎如果一个线程正在等待输入,其他线程继续照常运行......

哪一个是对的?如果我们让程序在一个线程上等待用户输入(你知道,比如连接到 X 或向 X 发送消息),而另一个线程只是在一个无限循环中等待对等点尝试连接,它还会正在监听连接?

谢谢!希望这是有道理的......线程是如此令人困惑:(

【问题讨论】:

    标签: c multithreading


    【解决方案1】:

    是的,在大多数当代操作系统上,一个进程中的多个线程可以等待输入(来自stdin、来自套接字等),而其他线程可以工作。

    考虑您的浏览器。当您上网时,用户界面不会在您等待页面加载时冻结(即浏览器的一个线程正在等待来自连接到远程主机的套接字的输入)。

    (...) 和另一个线程处于无限循环中等待对等方尝试连接 (...)

    这被称为忙等待,这被认为是一种不好的做法。转而看看select(2)epoll(4) 或相关机制。

    【讨论】:

      【解决方案2】:

      问题是,我记得我的教授告诉我们,如果你有 多个线程在同一个进程上运行,如果一个必须等​​待 用户输入,整个过程被“停止”,所以其他的都没有 线程将继续运行。

      要么你记错了,要么你的教授实际上没有尝试过。

      等待输入的线程被阻塞。其他线程继续正常运行。

      ...只是坐在一个无限循环中等待同伴尝试 连接...

      不! 不要在多线程代码中使用轮询循环!您的线程“等待对等方连接”更有可能等待 Seamphore 或事件发出信号。不涉及轮询 - 在信号量发出信号之前,它根本无法运行。

      【讨论】:

        【解决方案3】:

        您很可能需要了解诸如poll(或selectpselectppoll)等能够等待输入的多路复用函数。

        当然,如果一个线程正在等待 I/O,其他线程也可以很高兴地运行(除非互斥体或其他东西阻塞了它们,参见例如pthread_mutex_lock)。

        这至少在 Linux 上是正确的,其中线程是内核实体(内核调度程序处理任务,它们是线程)。请参阅 Linux 特定的 clone 系统调用 - 由线程库使用。

        【讨论】:

          【解决方案4】:

          在 Unix/Linux 中,您还可以使用 select() 系统调用来处理多个文件描述符(如套接字、管道等)的 i/o。

          【讨论】:

            【解决方案5】:

            如果一个线程被挂起,其他线程继续执行(这在某种程度上是拥有线程的主要原因!)。

            但是,您不应该在线程中执行无限循环 - 这会浪费很多处理器能力。相反,使用阻塞函数。阻塞函数是一个函数,一旦它可以做它应该做的事情或发生错误,它就会立即返回。虽然这样的阻塞函数会等待它必须做的任何事情,但它不会消耗任何处理器时间。

            【讨论】:

              【解决方案6】:

              我已经查看了这个答案,并且一直在寻找相同的答案。 因此,对于看到这篇文章的其他人,我发现 this examples 展示了如何同步用户输入和使用线程读取。

              不知道这与 OP 所说的有多接近,但至少对我有用。 碰巧我试图同步用户输入,这样它就不会阻塞程序的其余部分,但这有点让我不完全理解线程的力量。如果您对线程不太熟悉,只需查看上面的链接并运行示例 3

              所以希望这对未来的任何人都有效:)

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2023-03-11
                • 1970-01-01
                • 2011-05-28
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2015-08-23
                • 1970-01-01
                相关资源
                最近更新 更多