저는 .NET/Threads에 익숙하며 누구든지이 연습에서 저를 도울 수 있는지 알고 싶습니다. 나는 스레드 잠금없이 작동하도록하기 위해 주석을 대체해야합니다.NET 소비자/생산자 (대기열)
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);
+1. 정말로 깔끔하게 묻는 질문! –