【问题标题】:cpp unix multithread socket blocking and non-blocking. What is blocking?c++ unix 多线程套接字阻塞和非阻塞。什么是阻塞?
【发布时间】:2012-06-13 06:07:50
【问题描述】:

在我的多线程应用程序中,我使用 AF_UNIX 类型的套接字。似乎默认情况下它的阻塞。问题是“阻塞”是什么意思?它在应用程序上执行::recv::send 调用或所有线程 时是否阻塞线程(如fgets 做)?

如果它阻塞所有线程/整个应用程序,我猜需要使用非阻塞套接字?如果是这样,请举例说明如何设置 AF_UNIX 非阻塞套接字以及何时需要设置非阻塞模式(以及如何设置)。如何::recv ?谢谢。

【问题讨论】:

  • 想一想。如果套接字阻塞了整个应用程序,那么应用程序在等待套接字时实际上将无法做任何事情。如果阻塞套接字实际上阻塞了整个应用程序,仅此一项就会使阻塞套接字几乎毫无用处。
  • @Insilico 问题源于popen + fgets 问题。 fgets 仅从一个线程阻塞我的所有待调用线程。因此,我认为这也可能是在传输大量数据时阻塞套接字。
  • 我认为你错了。 fgets() 也不会阻止您的整个应用程序。事实上,IIRC 没有一个我知道“阻塞”意味着“阻塞整个应用程序”的函数。也许是其他原因导致整个应用程序看起来像是被阻塞了(例如死锁)。
  • 我怀疑您其他问题中答案的有效性,并发表评论说明这​​一点。我认为 fgets() 应该只阻塞当前线程。
  • @abrahab,我刚刚就您的其他问题发布了答案,希望对您有所帮助。

标签: c++ multithreading sockets unix


【解决方案1】:

它只阻塞发出 recv 调用的线程。

【讨论】:

    【解决方案2】:

    阻塞调用使线程等待操作完成。当您的线程在操作完成之前无法继续时使用它们,例如由于接收到的输入的数据依赖性。

    只要信息被缓冲以供传输,或启动读取操作,非阻塞调用就会返回。当没有数据依赖时使用它们。

    一般来说,blocking总是意味着“阻塞当前线程”,而不是“阻塞我进程中的所有线程。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-27
      • 1970-01-01
      • 1970-01-01
      • 2010-10-31
      • 2013-10-15
      • 2017-04-18
      相关资源
      最近更新 更多