[英]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.