转移.NET互斥锁的所有权

时间:2011-10-17 18:51:53

标签: .net windows-services ipc mutex signals

我已经读过mutex被线程拥有并且只能由拥有线程使用。在this answer中,解决方案建议每个进程必须拥有互斥锁的所有权,然后才能通知另一个进程。我必须承认我的愚蠢,我不知道如何使用IPC的活动,因为他们在我的MSDN阅读中没有弹出,我喜欢名字mutex'作为我的解决方案,但我甚至不知道如何在WindowsService和常规流程之间转移所有权。请帮忙。

我可以添加,Jon Skeet的教程here告诉我,不同用户之间的通信,正如我想LocalSystem所要求的那样,要求mutex名称前缀为&# 39;全球\&#39 ;.我在.NET文档中找不到任何提及,我认为他是对的,我必须比MSDN系统更多地看到它。

3 个答案:

答案 0 :(得分:1)

要获取已有Mutex的所有权,您可以使用静态方法Mutex.OpenExisting()和MutexRights = TakeOwnership

public static Mutex OpenExisting(
                                string name,    
                                MutexRights rights)
  • rights参数必须包含MutexRights.Synchronize标志,以允许线程在互斥锁和MutexRights.Modify标志上等待,以允许它们调用ReleaseMutex()方法。
  • OpenExisting方法尝试打开现有的命名互斥锁。如果系统互斥锁不存在,则此方法抛出异常而不是创建系统对象。

考虑到OpenExisting()可以抛出UnauthorizedAccessException异常,我建议使用以下构造函数创建一个新的Mutex:

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

然后通过分析createdNew变量的值,您可以检查mutext是否已存在或是否已创建新的。

答案 1 :(得分:0)

第一个过程:

// 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

答案 2 :(得分:0)

This页似乎已经相当完整地回答了我的问题,这是一种品味:

  

好吧,成功mutex.WaitOne()完成后,当前线程是互斥锁的所有者。然后在调用mutex.ReleaseMutex()后,线程不再拥有互斥锁。