【问题标题】:How does Blocking I/O operation works in a multithreaded C++ application?阻塞 I/O 操作如何在多线程 C++ 应用程序中工作?
【发布时间】:2015-11-02 17:10:31
【问题描述】:

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

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

【问题讨论】:

  • 这个问题在哪里非常具体?
  • 哪个操作系统? (评论不够长)
  • @gurka 有道理。例如,在 Linux 下,线程在调度方面几乎像进程一样处理。这在 Windows 上可能看起来有点不同,在诸如在没有 MMU 的微控制器上运行的操作系统上可能看起来有很大不同。
  • 感谢 cmets 和答案。我实际上只是指 Linux 操作系统。

标签: multithreading c++11


【解决方案1】:

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

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

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

没有,直到系统调用返回。

操作系统会在阻塞系统调用执行时调度线程(例如,类似于忙等待?)还是仅在系统调用返回后才调度线程?

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

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

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

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

【讨论】:

  • 我很头疼,甚至试图想象调度程序如何调度系统调用中阻塞的线程。如果它在系统调用中被阻塞,则意味着它在内核中并且正在等待某些东西。内核调度它意味着什么?
  • @SergeyA:正是我对“奇怪的实现”的观点:你可以设置你的系统调用接口,将该线程的执行指针设置为立即返回内核空间的东西,但是那将是非常有损性能的。
  • 谢谢大家的回答。
猜你喜欢
  • 1970-01-01
  • 2012-09-01
  • 2019-03-27
  • 2019-09-24
  • 2013-03-30
  • 2016-07-11
  • 1970-01-01
  • 2017-12-20
  • 1970-01-01
相关资源
最近更新 更多