非阻塞套接字中的并发?

时间:2014-04-29 13:06:51

标签: c sockets queue nonblocking

上下文:

Linux debian 64。 我自学了插座的工作方式,非常有趣。 单线程应用程序。

问题:

我不清楚是否存在异步/非阻塞问题。套接字设置为 fcntl(s,F_SETFL,O_NONBLOCK);

1)如果两个连接在一个套接字上同时到达,会发生什么?

当套接字无阻塞时,运行套接字的代码(称之为接收)是否会读取数据并并行地或按顺序执行其他内容? (单线程应用程序)

我的意思是,对于非阻塞套接字,传入请求是按顺序处理但非常快(非阻塞操作,因此只有网络成为瓶颈而不是cpu)或并行处理?

我问,因为我想在脚本中维护一个堆栈数组,并且在将数据推入其中时无法承受竞争条件。

提前致谢

1 个答案:

答案 0 :(得分:2)

“阻止”是一个非常具体的术语,它与操作系统的调度程序有关:如果用户空间调用阻止,则操作系统会调度正在进行调用的进程(或线程)。如果操作是非阻塞,这意味着如果操作无法成功,它将不会自动且自愿地导致进程进入休眠状态,而是立即返回调用状态,指示存在没什么可做的。 (当然,你的过程仍然可以通过先发制人的强制推卸,但这是一个单独的问题。)