簡體   English   中英

C# 互斥量處理

[英]C# Mutex handling

我不確定如何處理互斥鎖。 我需要一個進程只運行一次,但如果由於某種原因它意外崩潰或關閉,我還需要重置廢棄的互斥鎖。

出於這個原因,我做了一個助手調用,試圖獲取一個超時的互斥鎖(按名稱標識)。 如果獲取互斥鎖失敗,則返回 NULL 否則返回將由方法調用者處理的互斥鎖。 如果互斥鎖被放棄,我將重置它並將請求視為失敗(不是代碼被用於周期性過程的問題,如果鎖定有時失敗,那么該過程將恢復到下一次運行)。

我要問的是,是否有一些我沒有考慮過的情況可能會導致我的問題

這里的代碼:

public class MutexManager
{
    /// <summary>
    /// Try to acquire a global mutex
    /// </summary>
    /// <param name="mutexName">Mutex unique name</param>
    /// <param name="timeout_ms">Timeout in milliseconds (Optional : default = 5000, if <= 0 no timeout is applied, infinite wait and possibile daeadlock) </param>
    /// <returns>The acquired Mutex or null if Mutex can not be acquired</returns>
    public static Mutex TryRegister(string mutexName, int timeout_ms = 5000)
    {
        // unique id for global mutex - Global prefix means it is global to the machine
        string mutexId = string.Format("Global\\{{{0}}}", mutexName);

        bool createdNew;
        var allowEveryoneRule =new MutexAccessRule(    new SecurityIdentifier(WellKnownSidType.WorldSid
                                                       , null)
                                                       , MutexRights.FullControl
                                                       , AccessControlType.Allow
                                                       );
        Mutex mutex = null;
        {
            mutex = new Mutex(false, mutexId, out createdNew);
            var hasHandle = false;

            try
            {
                hasHandle = mutex.WaitOne(timeout_ms, false);
                if (hasHandle == false)
                    return null;
                else
                    return mutex;
            }
            catch (AbandonedMutexException)
            {
                mutex.ReleaseMutex();
                mutex.Close();
                mutex.Dispose();
                return null;
            }
            catch (Exception err)
            {
                return null;
            }
        }
    }
}

在這里,我將如何使用上面的 class。 下面的代碼用於周期性程序(計划通過 windows 調度程序),所以如果有時出現問題不是問題(下一次運行將完成工作),重要的是沒有競爭條件或死鎖

using ( var mutex = MutexManager.TryRegister("procedureName") )
{
    ...DO WORK
}

互斥鎖由單個進程“擁有”,如果進程崩潰或關閉,互斥鎖將被釋放。

如果進程崩潰並且 Mutex 被釋放,那么它被認為是“被放棄的”,這是一種表明原始進程不再擁有它的信號——但也沒有明確地釋放它。

我對您的問題或代碼不太了解的是對廢棄互斥體的處理。 如果之前沒有放棄,助手只會返回一個互斥鎖。 如果它被放棄,代碼會成功檢索 Mutex,然后釋放它並返回,而根本不提供 Mutex。

這可能是意圖,但根據問題的措辭有點難以理解。 如果幫助程序旨在重置返回 Mutex,則AbandonedMutexException的處理看起來不正確,因為它將始終返回 null。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM