Передача права собственности на .NET мьютексы - PullRequest
3 голосов
/ 17 октября 2011

Я читал о том, что mutex принадлежит потокам и может использоваться только владельцем.В этом ответе решение предполагает, что каждый процесс должен вступить во владение мьютексом, прежде чем подать сигнал другому, который завершен.Я должен признать свою глупость здесь, я не знаю, как бы я использовал события для IPC, поскольку они не всплыли в моем чтении MSDN, мне нравится уникальное имя mutex в качестве моего решения, но я недаже знаю, как передать право собственности между WindowsService и обычным процессом.Пожалуйста, помогите.

Могу ли я добавить, учебник Джона Скита здесь сообщает мне, что для общения между разными пользователями, как я полагаю, LocalSystem, требуется префикс mutex имен с 'Global\».Я не смог найти упоминаний об этом в документации .NET, полагаю, он прав и должен смотреть за пределы системы MSDN больше, чем я.

Ответы [ 3 ]

1 голос
/ 17 октября 2011

Чтобы стать владельцем уже существующего Mutex, вы можете использовать статический метод Mutex.OpenExisting () с MutexRights = TakeOwnership

public static Mutex OpenExisting(
                                string name,    
                                MutexRights rights)
  • Параметр прав должен включать MutexRights.Флаг синхронизации, позволяющий потокам ожидать мьютекса, и флаг MutexRights.Modify, позволяющий им вызывать метод ReleaseMutex () .
  • Метод OpenExisting пытается открыть существующий именованный мьютекс.Если системный мьютекс не существует, этот метод выдает исключение вместо создания системного объекта.

Учитывая, что OpenExisting () может генерировать UnauthorizedAccessException исключение, я бы предложил создатьnew Mutex, используя следующий конструктор:

public Mutex(
    bool initiallyOwned,
    string name,
    out bool createdNew
)

, а затем, проанализировав значение переменной createdNew, вы можете проверить, существует ли mutext или уже создан новый.

0 голосов
/ 17 октября 2011

Эта страница , кажется, ответила на мой вопрос довольно полно, вот вкус:

Что ж, после успешного завершения mutex.WaitOne() текущая тема становится владельцеммьютекс.Затем после вызова mutex.ReleaseMutex() поток больше не владеет мьютексом.

0 голосов
/ 17 октября 2011

Первый процесс:

// Create a new Mutex. 
// True means this thread/process has inital ownership
Mutex mut = new Mutex(true, "some unique name");
//Now do your job
//Release ownership
mut.ReleaseMutex();

Теперь код для второго процесса.

// Create an instance of mutex object with the same name
// This means this thread/process has NOT inital ownership
Mutex mut = Mutex.OpenExisting("some unique name");
//Your thread will block until the first passes ownership
mut.WaitOne();
//Now you have it and can do your job
...