gpt4 book ai didi

.NET 消费者/生产者(队列)

转载 作者:行者123 更新时间:2023-12-04 09:10:49 25 4
gpt4 key购买 nike

我是 .NET/Threads 的新手,我想知道是否有人可以帮助我完成这个练习。我需要替换注释以使其在不锁定线程的情况下工作:

private Queue<int> queue;

public void ConsumeFunc(){
while (true){
// 1
while (/* 2 */){
// 3
}
int element = queue.Dequeue();
// 4
Console.WriteLine("Consume element: " + element);
Thread.Sleep(new Random((int)DateTime.Now.Ticks).Next(0, 2) * 1000);
}
}

private void ProduceFunc(){
while (true) {
// 1
queue.Enqueue(DateTime.Now.Millisecond);
// 2
// 3
Thread.Sleep(new Random((int)DateTime.Now.Ticks).Next(0, 2) * 1000);
}
}

我管理了这个,但它没有完成
public void ConsumerFunc(){
while (true){
Monitor.PulseAll(queue); // 1
while (queue.Count == 0){ /* 2 */
Monitor.Wait(queue); // 3
}
int element = queue.Dequeue();
lock (queue) // 4
Console.WriteLine("Consume element: " + element);
Thread.Sleep(new Random((int)DateTime.Now.Ticks).Next(0, 2) * 1000);
}
}


public void ProducerFunc(){
while (true) {
lock (queue) // 1
queue.Enqueue(DateTime.Now.Millisecond);
Monitor.PulseAll(queue); // 2
// 3 ???
Thread.Sleep(new Random((int)DateTime.Now.Ticks).Next(0, 3) * 1000);
}
}

并给出以下错误:
从不同步的代码块调用对象同步方法 ,
Monitor.PulseAll(queue);

最佳答案

与其努力自己实现同步,不如看看 BlockingCollection .它为您处理所有同步,并且比您可以使用 Queue 创建的任何东西都要好。类和 Monitor .

.NET 文档、Stack Overflow 和其他地方都有大量示例。您可能会发现我的文章很有用:http://www.informit.com/guides/content.aspx?g=dotnet&seqNum=821

关于.NET 消费者/生产者(队列),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8640160/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com