为什么在临界区中休眠是并发问题?

any*_*ser 3 operating-system

我想了解如果我尝试在关键部分休眠,即使我拿到了锁,为什么会出现并发问题。

我可能在睡觉,因为说我在做 I/O。

Jer*_*fin 5

问题基本上是,当你睡觉时,你什么也做不了。通常,您希望在尽可能短的时间内“处于”临界区。您在临界区中花费的时间越长,任何其他线程必须等待进入它的时间就越长。

通常,I/O 几乎肯定应该在任何临界区之外进行。举个例子,如果你正在读取一些数据,你会想要读取数据,然后进入临界区并将数据添加到某个结构中,以便其他所有内容都可以看到它(例如,添加一个带有指向该数据的指针的节点)数据转换为向量),然后离开 CS。

在 CS 中执行 I/O 本身几乎从来没有一个很好的理由——你通常只有一个线程来执行 I/O,并有一个队列(或双端队列,或其他)来处理对或该线程的输出。向队列中添加内容或从队列中读取内容受到 CS(或者可能是信号量等)的保护,但发生得很快,因此一个线程可以完成它的工作,然后迅速让开,以便其他线程也可以。