Реализация мьютекса и монитора в WP7 Mango

В чем разница между мьютексом и реализацией монитора. Может ли кто-нибудь, пожалуйста, помогите мне изучить оба из них для wp7(реализуемый код для wp7). Пожалуйста, попробуйте добавить некоторые фрагменты кода, которые помогут мне понять методы простым способом. Спасибо заранее Stezma

1 ответ

Решение

Мьютекс может блокировать несколько процессов. Это было бы полезно в Windows Phone, если у вас запущена запланированная задача, требующая эксклюзивного доступа к ресурсу. Чтобы заблокировать мьютекс между процессами, Mutex нужно дать имя.

Монитор может блокироваться только внутри процесса.

Пример мьютекса:

Задача приложения телефона:

   public class DatabaseService
    {
    private Mutex _mut=new Mutex("mutex control",false);
    public void AddToDatabase(DbObject row)
    {
        mut.WaitOne();
        SaveRow(row);
        mut.ReleaseMutex();
    }
    }

Класс запланированного задания:

 public class ResourceUtilisation
    {
    private Mutex _mut=new Mutex("mutex control",true);
    //.. does stuff
    private static void UseResource()
    {
        // Wait until it is safe to enter.
        _mut.WaitOne();

        //Go get dataabse and add some rows
        DoStuff();

        // Release the Mutex.
        _mut.ReleaseMutex();
    }
    }

В приведенном выше примере мы разрешаем только одному приложению одновременно доступ к локальному ресурсу базы данных. Вот почему мы использовали Mutex.

Пример монитора (с использованием синтаксиса блокировки):

Задача приложения телефона:

   public class DatabaseService
    {
    private object _locker=new object();
    public void AddToDatabase(DbObject row)
    {
        lock(_locker)
            SaveRow(row);
    }
    }

Класс запланированного задания:

 public class ResourceUtilisation
 {
    private object _locker=new object();
    //.. does stuff
    private static void UseResource()
    {

        //Go get dataabse and add some rows
        lock(_locker)
            DoStuff();
    }
 }

В этом примере мы можем остановить более одного потока приложения, входящего в SaveRow, и мы можем остановить более одного потока Scheduled Task от входа в метод DoStuff. Что мы не можем сделать с монитором, так это убедиться, что только один поток одновременно обращается к локальной БД.

Это в основном разница. Монитор намного быстрее, чем Mutex.

Другие вопросы по тегам