多线程程序:等待输入

时间:2011-11-27 20:15:47

标签: c multithreading

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

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

但是后来我们一直在阅读,似乎有一个线程在等待输入,其他线程一如既往地继续运行......

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

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

6 个答案:

答案 0 :(得分:5)

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

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

  

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

那叫做忙着等待,这被认为是一种不好的做法。请改为查看select(2)epoll(4)或相关机制。

答案 1 :(得分:4)

  

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

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

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

  

......只是坐在无限循环中等待对等方尝试   连接...

没有! 不要在多线程代码中使用轮询循环!你的线程'等待对等连接'更有可能等待Seamphore或Event发出信号。没有涉及的民意调查 - 在信号量发出信号之前,它根本无法运行。

答案 2 :(得分:3)

您可能需要了解能够等待输入的poll(或selectpselectppoll)等多路复用功能。

当然,如果一个线程正在等待I / O,其他线程很高兴能够运行(除非互斥锁或其他东西阻止它们,请参阅例如pthread_mutex_lock)。

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

答案 3 :(得分:3)

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

答案 4 :(得分:2)

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

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

答案 5 :(得分:0)

我看了这个答案,并且一直在寻找相同的答案。 所以,对于其他人来说,我发现this examples显示了如何同步用户输入和读入线程。

不知道这与OP所说的有多接近,但至少对我有用。 发生了我曾尝试同步用户输入,以便它不会阻止程序的其余部分,但这有点我没有完全理解线程的力量。如果您对线程不熟悉,只需查看上面的链接并运行示例3

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