【发布时间】: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