多个消费者使用相同的值

本文关键字:消费者 | 更新日期: 2023-09-27 18:15:47

我希望得到一些关于某种生产者/消费者场景的概念性建议。

假设我有一个"生产者"线程,它通常以一种相当周期性的方式创建一些整数或双精度值,但两者之间可能存在任意延迟。

现在有几个"消费者"线程,当这个值到达时,它们都应该开始并行地处理这个值。

每一个"消费者"线程可能需要额外的时间来完成它的任务。一旦"消费者"准备好了,它就应该等待下一个产生的值。

但是,如果使用前一个值完成任务花费的时间太长,则消费者应该立即继续使用任何到期的值(如果有的话)。我不需要队列,如果在消费者工作时有几个到达,值可能会被跳过。所以,如果有一个新值,如果任何消费者准备消费下一个值,它是最新的,这是唯一重要的。

除了每个"消费者"有一个AutoResetEvent/ManualResetEvent之外,还有其他可行的方法吗?

具体的解决方案应该在Unity3D中工作,所以它需要Mono2。

编辑:因为我对一个概念性的建议很感兴趣,所以很难拿出一些源代码。我希望下面的内容能稍微说明这个问题。

int data = 0;
producer = new Timer(20, OnTimer);
consumer1 = new Consumer(OnConsume1);
consumer2 = new Consumer(OnConsume2);
OnTimer()
{
        data = data + 20;
        TriggerConsumers();
}
OnConsume1()
{
        while (running)
        {
                WaitForData();
                // do something with data
                Thread.Sleep(10);
        }
}
OnConsume2()
{
        while (running)
        {
                WaitForData();
                // do something with data
                Thread.Sleep(30);
        }
}

有生产者,它每20毫秒创建一个新值。然后有两个消费者(稍后可能会有更多)等待该值并对其进行处理。一个消费者花费10ms,另一个花费30ms。如果生产者/消费者同时开始,这将导致以下时间轴:

<>之前20 data = 20 => onconsumme1, onconsumme2 run with data = 2030 onconsumme1将等待数据,onconsumme2正在"工作"40 data = 40 => onconsumerme1运行与数据= 40,onconsumerme2仍然"工作"onconsumme1将等待,onconsumme2将运行数据= 4060 data = 60 => onconsumerme1运行与数据= 60,onconsumerme2是"工作"OnConsume1将等待,OnConsume2仍然"工作"80 data = 80 => onconsumme1 => data = 80, onconsumme2也应该在80下运行(忽略可能在60下运行的竞争)

多个消费者使用相同的值

听起来你会想要一个堆栈/队列,如果你想要多个可用的值,与最大深度。或单个可空值,如。

public int? value;
OnConsume1()
{
        while (running)
        {
                int myValue;
                if(value != null) // or value.HasValue
                {
                    myValue = value.Value; // or (int)value
                    value = null; // let other consumers know the value is being processed
                    // do something with data
                }
                Thread.Sleep(10);
        }
}

你会想使用c#的lock功能来保持一次只有一个线程修改值。

如果你想使用一个线程安全的容器,看看这些