Исключение нехватки памяти при игре с Monitor.Wait и Monitor.PulseC#

Место общения программистов C#
Ответить
Anonymous
 Исключение нехватки памяти при игре с Monitor.Wait и Monitor.Pulse

Сообщение Anonymous »

Я экспериментировал с классом Monitor в .NET и нашел фрагмент кода, который вроде бы работает, но когда я его зацикливаю на некоторое время, он выдает исключение OutOfMemoryException.

Я запускаю это на 64-разрядной машине разработчика Windows 8 с 8 ГБ ОЗУ, и этот процесс никогда не занимает более 100 МБ места в ОЗУ.

Это мой код:

Код: Выделить всё

    using System;
using System.Threading;

public class Program
{
public static void Main()
{
while (true) {

object theLock = new Object();
Thread threadA = new Thread(() =>
{
Console.WriteLine("Thread A before lock");
lock (theLock)
{
Console.WriteLine("Thread A locking, about to Wait");
Monitor.Wait(theLock);
}
Console.WriteLine("Thread A after lock");
});

Thread threadB = new Thread(() =>
{
Console.WriteLine("Thread B before lock");
lock (theLock)
{
Console.WriteLine("Thread B lockint, about to Pulse");
Monitor.Pulse(theLock);
}
Console.WriteLine("Thread B before lock");
});

threadA.Start();
threadB.Start();

GC.Collect();

}
}
}
Я прочитал здесь, что это может быть проблема фрагментации, и добавил в конце GC.Collect(). Однако я не выделяю большие куски пространства.

Затем я решил измерить, сколько примерно итераций проходит цикл, прежде чем выдаст исключение, и добавил счетчик:

Код: Выделить всё

    using System;
using System.Threading;

public class Program
{
public static void Main()
{
int counter = 0;

while (true) {
Console.WriteLine(counter);
counter++;

object theLock = new Object();
Thread threadA = new Thread(() =>
{
Console.WriteLine("Thread A before lock");
lock (theLock)
{
Console.WriteLine("Thread A locking, about to Wait");
Monitor.Wait(theLock);
}
Console.WriteLine("Thread A after lock");
});

Thread threadB = new Thread(() =>
{
Console.WriteLine("Thread B before lock");
lock (theLock)
{
Console.WriteLine("Thread B lockint, about to Pulse");
Monitor.Pulse(theLock);
}
Console.WriteLine("Thread B before lock");
});

threadA.Start();
threadB.Start();

GC.Collect();

}
}
}
Похоже, это сильно замедляет выдачу исключения. Я измерил 36 000 итераций.

Подробнее здесь: https://stackoverflow.com/questions/295 ... itor-pulse
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»