簡體   English   中英

如何自動檢查和重置超時?

[英]How do I check for and reset a timeout atomically?

我有一個檢查超時時間是否到期的方法,如果超時,則重置開始時間並返回true:

bool CheckAndResetTimeout() {
    if (DateTime.UtcNow > _start + _timeout) {
        _start = DateTime.UtcNow;
        return true;
    }
    return false;
}

如果有2個線程同時命中該線程,那么保證如何只返回true一次,該如何確保該線程安全? 我認為可以通過雙重檢查鎖定來實現,但是我希望在BCL(很可能在System.Threading下)中找到一些可以為此提供更高層次抽象的東西。

您可以為此使用lock關鍵字:

static object TimerLock = new object();
static bool CheckAndResetTimeout()
{
    lock (TimerLock)
    {
        if (DateTime.UtcNow > _start + _timeout)
        {
            _start = DateTime.UtcNow;
            return true;
        }
        return false;
    }
}

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/lock-statement

我希望盡可能避免lock ,例如通過從Sysetm.Threading.Interlocked組成更輕量級的結構,但我沒有想出一種好方法。 因此,現在我正在進行雙重檢查鎖定 ,這至少在大多數情況下避免了lock開銷。

private readonly object _timeoutLock = new object();

public bool CheckAndResetTimeout() {
    if (DateTime.UtcNow > _start + _timeout) {
        lock (_timeoutLock) {
            if (DateTime.UtcNow > _start + _timeout) {
                _start = DateTime.UtcNow;
                return true;
            }
        }
    }
    return false;
}

暫無
暫無

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

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