【问题标题】:server socket in a new thread新线程中的服务器套接字
【发布时间】:2017-09-19 15:09:04
【问题描述】:

我想创建一个服务器套接字,但不想通过“接受调用”阻止我的主应用程序。所以我将在主应用程序中创建一个套接字。使用 pthread 机制我创建了一个新线程,我将在其中使用“接受调用”。在主应用程序中创建套接字后,我调用了“pthread join”。现在,当这个线程执行时,“接受调用”再次阻塞了主应用程序。我使用 gdb 进行了检查。我该如何解决这个问题?

【问题讨论】:

  • “pthread_join() 函数应暂停调用线程的执行,直到目标线程终止。” - 这意味着它将阻塞主线程,因为新线程仍将监听任何新调用。有关更多详细信息,请访问此处:pthread_join
  • 那么,不调用 pthread_join() 对我有用吗?
  • Protip - 不要调用 pthread_join 除非你别无选择。在你的情况下,一个接受循环,永远没有必要。
  • 那pthread join() 用在什么场景呢?如果主线程被挂起。这就像一个接一个地调用一个函数。我觉得我们根本不需要线程。
  • @SnehaDolly 如果你要等他们,一一不,没有意义。如果您的线程与进程具有相同的生命周期,例如。您的 accept() 循环或池线程,加入不是必需的,如果可能的话,应该避免。

标签: c linux network-programming pthreads


【解决方案1】:

一种方法是将主服务器套接字描述符设为非阻塞并使用 select 系统调用。当 select 返回并且主套接字描述符有数据时,创建一个新线程来处理新接受的连接。这样您就可以实现并行性,创建的新连接将具有自己的上下文,并且即使在 accept() 等待连接时也会尽可能安排。

【讨论】:

  • 在 accept() 循环中使用 select() 毫无意义。没有任何收获,您必须进行额外的系统调用。你明白 select() 是一个阻塞调用,是吗?
  • @Naresh。正如 Martin James 所说,选择调用是阻塞的。因此主应用程序将阻塞。我有一个主应用程序不应该阻塞的场景。而且我不知道客户什么时候来连接。
猜你喜欢
  • 1970-01-01
  • 2015-10-06
  • 1970-01-01
  • 1970-01-01
  • 2021-07-19
  • 1970-01-01
  • 2017-05-29
  • 2018-08-23
  • 2012-01-07
相关资源
最近更新 更多