多个消费者使用相同的值
本文关键字:消费者 | 更新日期: 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
功能来保持一次只有一个线程修改值。
如果你想使用一个线程安全的容器,看看这些