Usage of Mutex in c#

后端 未结 4 2027
陌清茗
陌清茗 2020-12-15 03:23

I am a bit new in threading in c# and on general, in my program I am using mutex to allow only 1 thread getting inside a critical section and f

相关标签:
4条回答
  • 2020-12-15 04:03

    This pattern does no locking at all. Every thread creates a new Mutex object and immediately owns the lock for it. Other threads create and use a new Mutex itself.

    Consider using a regular lock()!

    lock(_lockobject) {
       // do inside what needs to be done - executed on a single thread only
    } 
    

    where _lockobject is a simple private variable in your class:

    private object _lockobject; 
    

    Edit: thanks to the commenters! Situations exist, where lock(this) can be dangerous. So I removed that.

    0 讨论(0)
  • 2020-12-15 04:06

    The problem here is that all your callers are using a different mutex; you need the locking object to be shared, usually by making it a field. For example, and switching to a simpler lock metaphor:

    private readonly object syncLock = new object();
    public void ThreadSafeMethod() {
        lock(syncLock) {
            /* critical code */
        }
    }
    

    or using the mutex:

    private readonly Mutex m = new Mutex();
    public void ThreadSafeMethod() {
        m.WaitOne();
        try {
            /* critical code */
        } finally {
            m.ReleaseMutex();
        }
    }
    
    0 讨论(0)
  • 2020-12-15 04:15

    Mutex use to identify run app instance.

     using (Mutex mutex = new Mutex(true, "app name", out createdNew))
                {
                    if (createdNew)//check app is already run
                    {
                        KillOthers();
                        StartApp();
                    }
                    else
                    {
                        MessageBox.Show("Another instance already running!");
                    }
                }
    
    0 讨论(0)
  • 2020-12-15 04:21

    It looks like you give each Thread its own Mutex. That won't work.

    And a Mutex is overkill in most situations. You only need:

    private static object syncLock = new object();  // just 1 instance
    
    ....
    
    lock(syncLock)
    {
        // critical section
    }
    
    0 讨论(0)
提交回复
热议问题