Mutex()和Mutex(true, "myMutex")线程对象之间的区别是什么?

3
我有一段代码,它创建了多个线程,所有线程都试图将信息记录在一个单独的文件中。我尝试使用互斥锁来记录文件日志,但是当我使用Mutex()Mutex(true/false, "myname")对象时,我得到了不同的响应。Mutex()可以得到预期的正确结果,但是Mutex(true/false, "myname")会丢失一些日志信息。

那么它们之间有什么区别呢?

System.Threading.Mutex mtx = new System.Threading.Mutex(false ,"Myname" );

try
{       
    try
    {
        mtx.WaitOne();
    }
    catch (AbandonedMutexException) 
    { }            

  //log into file
}

catch (Exception)
{
    Console.WriteLine("EXCEPTION CAUGHT ***");
}
finally
{
    mtx.ReleaseMutex();
    mtx.Close();               
}

你应该添加一个标签来指明你正在使用的编程语言。从类名/命名空间来看,我猜你在使用C#。 - dcastro
你尝试过这里的文档吗?(http://msdn.microsoft.com/en-us/library/system.threading.mutex.aspx) - Farhad Alizadeh Noori
3
Mutex() 表示创建一个新的互斥对象,用于控制对共享资源的访问。如果该对象已经存在,则打开已有对象。Mutex(bool, string) 含义是创建或打开具有指定名称的新互斥对象。第一个参数 bool 指示是否拥有互斥对象的初始所有权,第二个参数 string 则是互斥对象的名称。 - Adam Houldsworth
1
请参阅MSDN:http://msdn.microsoft.com/en-us/library/f55ddskf(v=vs.110).aspx - 基本上,命名互斥量可以从多个地方访问 - 包括跨进程甚至跨用户(如果是全局的)。匿名互斥量是唯一且隔离的。 - Marc Gravell
哪些日志信息缺失?你的代码是否展示了日志的写入? - Adam Houldsworth
缺失的日志信息很可能不是由于您初始化互斥锁的方式造成的,您应该在其他地方寻找错误。 - Jim Mischel
1个回答

3
无参数构造函数的文档中得知:
调用这个构造函数与调用Mutex(Boolean)构造函数并指定false来初始化mutex所有权相同。也就是说,调用线程不拥有mutex。
第二个参数仅为mutex命名。因此,如果另一个进程使用相同的名称创建了一个mutex,则现有的mutex将在这两个进程之间共享。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接