2011-11-27 101 views
2

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

问题是,我记得我的经理告诉我们,如果你有多个线程在同一个进程上运行,如果必须等待用户输入,整个进程将被“暂停”,所以其他线程都不会保留运行。

但是,我们一直在阅读了,它好像如果一个线程是在输入等待,其他都保持照常运行...

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

谢谢!希望这是有道理的......线程是如此混乱:(

回答

5

是的,在大多数当代操作系统中,一个进程内的多个线程可以等待输入(从stdin,从套接字等),而其他可以当您等待页面加载时(即,浏览器的某个线程正在等待来自连接到远程主机的套接字的输入)时,用户界面不会冻结,而您在浏览互联网时并不会冻结该页面。

(...)和另一个线程只是坐在那里在一个无限循环等待对等体尝试连接(..) )

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

4

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

要么你记得错了,要么你的教授还没有真正尝试过。

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

...只是在无限循环坐在那里等待同伴试图 连接...

没有! 请注意不要在多线程代码中使用轮询循环!你的线程'等待对等连接'更有可能等待Seamphore或Event发送信号。没有涉及轮询 - 直到信号灯发出信号才能运行。

2

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

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

3

你很可能需要了解复用功能,如poll(或selectpselectppoll),它能够等待输入。当然,如果一个线程正在等待I/O,那么其他线程可以很好地运行(除非互斥或其他东西阻塞了它们,例如参见pthread_mutex_lock)。

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

3

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

0

我看过这个答案,并且一直在寻找相同的东西。 因此,对于任何人来到这篇文章,我发现this examples显示如何syncro用户输入和阅读与线程。

不知道这是怎么接近OP是在说什么,但至少为我工作。 我尝试了syncro userinput以避免阻塞程序的其余部分,但这有点不完全理解线程的力量。只要看看上面的链接,并运行示例3如果你不太熟悉线程。

因此,希望这对未来的任何人都有效:)