阻塞I / O操作如何在多线程C ++应用程序中工作?

时间:2015-11-02 17:10:32

标签: multithreading c++11

我有一个非常具体的问题。

  1. 如何阻止I / O操作,例如recvfrom()调用工作 多线程应用程序?
  2. 操作系统如何安排阻塞系统调用的线程?
  3. 当阻塞系统调用时,操作系统是否会调度线程 执行(例如类似于忙等待?)或仅限操作系统 系统调用返回后安排线程?
  4. 是否会导致执行线程的中断(如果是的话) 如果对代码的关键部分进行编码是值得的 互斥体中的其他线程或某种原子操作?)

1 个答案:

答案 0 :(得分:2)

  

如何阻止I / O操作,例如recvfrom()调用工作       多线程应用程序?

线程被阻止,其他线程继续被安排。这是开发多线程应用程序的主要优势之一,即使在单核机器上也是如此。

  

操作系统如何安排具有阻塞系统调用的线程?

不是,直到系统调用返回。

  

当执行阻塞系统调用时,操作系统是否会调度线程(例如,类似于忙等待?),或者一旦系统调用返回,操作系统是否只调度线程?

首先,线程应该在系统调用中做什么?

一般来说,后者也可能,但至少可以说是调度的一个非常奇怪的实现。实际上,假设您是调度程序,因此您目前处于内核空间。线程的执行当前在用户空间中,因为它等待系统调用返回。那么线程在哪里继续"执行?

  

这是否会导致执行线程的中断(如果是这种情况,是否值得在互斥或某种原子操作中编写其他线程的关键部分?)

嗯,这就是阻塞调用的作用:暂停执行直到阻塞条件已经过去。