Использование класса монитора - PullRequest
3 голосов
/ 24 марта 2010

Я хотел бы задать пару вопросов, касающихся использования класса Monitor в .Net.

Чтобы понять Вопросы, пожалуйста, посмотрите следующий Код.

public class MyClass
{
    private List<int> _MyCollection = new List<int>();

    public void GetLock()
    {
        Monitor.Enter(_MyCollection);
    }

    public void ReleaseLock()
    {
        Monitor.Exit(_MyCollection);
    }

    public void UpdateCollection(/*anyparam*/)
    {
        //update collection without lock on collection
    }
}

public class MyAppMain
{
    private static MyClass myclass = new MyClass();

    public static void main(args)
    {
        try
        {
            myclass.GetLock();

            //an operation that does not do any update on myclass but wanted 
            //to ensure that the collection within myclass never update
            //while its doing following opetion

            //Do somthing
        }
        finally
        {
            myclass.ReleaseLock();
        }
    }
}

Теперь это правильное использование монитора, и нужно ли мне использовать Pulse или PulseAll, чтобы сигнализировать ожидающий поток, и если да, то чем использовать плюс до или после функции выхода?

С уважением Mubashar

Ответы [ 2 ]

2 голосов
/ 24 марта 2010

Да, вы правильно используете монитор.

Тем не менее, вы можете использовать оператор lock, чтобы сделать код более кратким:

public static void main(args)
{
    lock(myclass)
    {
    }
}
2 голосов
/ 24 марта 2010

Правильно получить ваш замок и затем отпустить его в блоке finally. Я бы получил блокировку до того, как запустится блок try, но он, вероятно, ничего не повредит, если не будет получено исключение при попытке получить блокировку.

Для того, что вы на самом деле пытаетесь сделать, вам нужно переосмыслить, какова ваша цель. В зависимости от того, является ли производительность проблемой, вы можете посмотреть на ReaderWriterLock. Если конкуренция низкая, рассмотрите возможность блокировки каждой операции, но с использованием спин-блокировки - что чрезвычайно дешево для операций, которые не имеют тенденцию перекрываться, но могут.

Также: Я думаю, вам нужно вернуться к понятию обновления коллекции без блокировки, если только вы не можете гарантировать, что только один поток будет обновлять коллекцию.

...