C++ 多线程信令

C++ 多线程信令,c++,windows,boost,C++,Windows,Boost,我想设计一个多线程应用程序,它执行以下操作: 一个线程按顺序写入循环缓冲区。然后将有n个读线程等待写入线程启动的某个信号来唤醒并从循环缓冲区读取。信号应该以某种方式包含一个整数值,该整数值表示要读取的循环缓冲区偏移量。这是否可能在C++中实现? 任何帮助都将不胜感激 由于我希望设计能够处理尽可能快的高速实时流量,因此我希望消除任何内存分配/释放。因此,循环队列将是在启动时分配的连续内存块。我不确定你所指的排队是否与此相符 生产者只需在每次有内容要写入时跟踪从何处开始写入字节的循环缓冲区数组。 因

我想设计一个多线程应用程序,它执行以下操作: 一个线程按顺序写入循环缓冲区。然后将有n个读线程等待写入线程启动的某个信号来唤醒并从循环缓冲区读取。信号应该以某种方式包含一个整数值,该整数值表示要读取的循环缓冲区偏移量。这是否可能在C++中实现? 任何帮助都将不胜感激

由于我希望设计能够处理尽可能快的高速实时流量,因此我希望消除任何内存分配/释放。因此,循环队列将是在启动时分配的连续内存块。我不确定你所指的排队是否与此相符

生产者只需在每次有内容要写入时跟踪从何处开始写入字节的循环缓冲区数组。 因此,我真正想要的是,当生产者完成一个写入事件,其中包含写入循环缓冲区的最后一个字节的位置(偏移量)时,它可以传播一个“信号”。这将避免需要锁定机制

当收到此“已传播”信号/事件时,使用者线程将唤醒。他们自己只需要跟踪他们离开的地方,然后读取信号偏移值。
最后,生产者和消费者当然需要知道循环缓冲区从何处开始,它有多大,以便他们知道何时包装。

在我看来,这是一种糟糕的做法。让生产者简单地将项目添加到循环缓冲区中。让每个读卡器等待循环缓冲区为非空。当它非空时,读取器线程只需从缓冲区中删除下一项并对其进行处理。缓冲区本身应该跟踪偏移量之类的内容

至于为什么这样更好:主要是因为它允许系统的每个部分做自己的事情,而与系统的其他部分的交互最少

在描述系统时,生产者需要了解队列的内部细节,以及使用者线程的所有基本细节(在任何给定时间唤醒哪些线程,在任何给定时间空闲哪些线程,安排哪些线程执行任何特定任务等等)

我所建议的设计使制作人专注于制作。它对系统其余部分的唯一了解包括一件事:一旦产生任务,如何将任务放入队列

同样,使用者线程只需要知道如何从队列中获取任务,以及如何执行该任务

队列本身负责所有必需的线程同步。只有当任务放入队列或从队列中移除时,才需要同步。队列本身是可重用的(几乎可以用于这种生产者-消费者的情况)和可替换的(例如,在基于锁和无锁的实现之间进行非常简单的切换)

线程调度留给操作系统——空闲的使用者线程只是在队列上等待,操作系统决定唤醒哪个线程来执行特定任务。如果它们中没有一个当前处于空闲状态,那么操作系统也已经“知道”了,并让它们执行当前的处理,直到其中一个完成并再次等待队列

总结:您的建议使系统的三个部分中的每一个都更加复杂。更糟糕的是,这三个部分相互交织在一起,因此很难单独处理其中任何一个部分


通过这种设计,设计的每一部分都保持了实质上的简单,并且每一部分都与其他部分保持着相当的隔离,因此每一部分都可以与其他部分隔离工作、推理等。

在我看来,这是一种糟糕的做事方式。让生产者简单地将项目添加到循环缓冲区中。让每个读卡器等待循环缓冲区为非空。当它非空时,读取器线程只需从缓冲区中删除下一项并对其进行处理。缓冲区本身应该跟踪偏移量之类的内容

至于为什么这样更好:主要是因为它允许系统的每个部分做自己的事情,而与系统的其他部分的交互最少

在描述系统时,生产者需要了解队列的内部细节,以及使用者线程的所有基本细节(在任何给定时间唤醒哪些线程,在任何给定时间空闲哪些线程,安排哪些线程执行任何特定任务等等)

我所建议的设计使制作人专注于制作。它对系统其余部分的唯一了解包括一件事:一旦产生任务,如何将任务放入队列

同样,使用者线程只需要知道如何从队列中获取任务,以及如何执行该任务

队列本身负责所有必需的线程同步。只有当任务放入队列或从队列中移除时,才需要同步。队列本身是可重用的(几乎可以用于这种生产者-消费者的情况)和可替换的(例如,在基于锁和无锁的实现之间进行非常简单的切换)

线程调度留给操作系统——空闲的使用者线程只是在队列上等待,操作系统决定唤醒哪个线程来执行特定任务。如果它们中没有一个当前处于空闲状态,那么操作系统也已经“知道”了,并让它们执行当前的处理,直到其中一个完成并再次等待队列

总结:您的建议使系统的三个部分中的每一个都更加复杂。更糟糕的是,这三个部分相互交织在一起,因此很难单独处理其中任何一个部分


通过这种设计,设计的每个部分都保持了实质上的简单,并且每个部分都与其他部分保持了相当的隔离,因此每个部分都可以独立于其他部分进行处理、推理等。

根据您最近的编辑,我