Multithreading 管道使用什么机制“唤醒”收件人?

Multithreading 管道使用什么机制“唤醒”收件人?,multithreading,ipc,message-queue,pipe,messaging,Multithreading,Ipc,Message Queue,Pipe,Messaging,我有两个问题,这里是一个 在Windows上,我熟悉管道及其工作原理。然而,我很好奇操作系统使用什么机制来通知收件人线程消息到达 线程是否连续轮询和休眠数据?操作系统是否检查线程是否处于睡眠状态并将其唤醒?还是使用了其他机制 具体来说,我想构建一个IPC系统,其中许多线程需要传递消息。我不需要使用管道,但我确实需要知道最有效的通知方法。开发人员可以决定如何使用管道,是睡眠/轮询,还是调用阻塞函数并等待数据可用 关于管道唤醒进程的机制——假设进程处于阻塞读取调用中——与任何其他操作系统调用一样,负

我有两个问题,这里是一个

在Windows上,我熟悉管道及其工作原理。然而,我很好奇操作系统使用什么机制来通知收件人线程消息到达

线程是否连续轮询和休眠数据?操作系统是否检查线程是否处于睡眠状态并将其唤醒?还是使用了其他机制


具体来说,我想构建一个IPC系统,其中许多线程需要传递消息。我不需要使用管道,但我确实需要知道最有效的通知方法。

开发人员可以决定如何使用管道,是睡眠/轮询,还是调用阻塞函数并等待数据可用


关于管道唤醒进程的机制——假设进程处于阻塞读取调用中——与任何其他操作系统调用一样,负责的不是管道,而是操作系统:它注册操作并阻塞进程/线程,直到数据可用。当数据可用时,它完成系统调用。

这是Unix的答案。我认为Windows非常类似,因为这个解决方案已经存在很长时间了,而且众所周知它很健壮。细节会有一些不同的API调用、语义细节等

这取决于另一端是在阻塞模式还是非阻塞模式下使用管道的文件描述符

在阻塞模式下,进程在操作系统内核中等待数据可用。通知发生的方式取决于操作系统。很有可能它涉及到一个被认为是可运行的进程队列,并且由于内核可以在很大程度上控制中断它的内容,所以一切都变得简单了。在一个简单的单处理器实现中,您可以做一些琐碎的事情,比如在写入管道时注意到另一个进程正等待通过某种“兴趣集”从中读取,从而在此时将读取器标记为可运行,此时由调度程序决定

在非阻塞模式下,要么进程时不时地轮询,真恶心!或者他们正在使用系统调用,如select或poll,也有一些更高性能的变体。这非常类似于Windows调用WaitForMultipleObjects,并且非常适合管道。这反过来又回到了可运行进程队列、兴趣集和调度程序


由于管道是满的还是空的,所以阻塞也不太重要,因为控制流在读写器之间几乎是对称的。当然,与数据流不同。

由于我的应用程序是一个进程内的自我管理IPC,因此唤醒、您有工作策略似乎是最有效的。线程将为每个可能的发送者检查各种输入缓冲区中的数据1,从而消除对锁的需要;或者是一个同步的方法,但这是缓慢的,然后在没有找到时休眠。如果需要的话,发送者会向系统发出信号叫醒接收者。或者我走错方向了吗?如果您在单个进程中工作,那么这可能不是最好的解决方案,您可以使用多线程消息队列库中已有不同的实现,可用于在单个进程中的线程之间进行通信。谢谢David-我会看看我能找到什么。