在C#中,使用Thread.Wait()
或Task.Wait()
方法時,可能會遇到虛假喚醒(spurious wakeup)的問題。虛假喚醒是指線程在等待某個條件滿足時被喚醒,但實際上該條件并未滿足。為了處理這種情況,可以使用循環檢查條件是否真正滿足。
以下是使用Thread.Wait()
和Monitor.Wait()
處理虛假喚醒的示例:
using System;
using System.Threading;
class Program
{
static void Main()
{
object lockObject = new object();
bool condition = false;
Thread thread = new Thread(() =>
{
lock (lockObject)
{
while (!condition) // 使用循環檢查條件是否滿足
{
Monitor.Wait(lockObject); // 虛假喚醒時,線程會繼續執行這里的代碼
}
}
});
thread.Start();
Thread.Sleep(1000); // 讓線程開始等待
lock (lockObject)
{
condition = true; // 設置條件滿足
Monitor.Pulse(lockObject); // 喚醒等待的線程
}
thread.Join();
}
}
以下是使用Task.Wait()
和Monitor.Wait()
處理虛假喚醒的示例:
using System;
using System.Threading;
using System.Threading.Tasks;
class Program
{
static async Task Main(string[] args)
{
object lockObject = new object();
bool condition = false;
Task task = Task.Run(() =>
{
lock (lockObject)
{
while (!condition) // 使用循環檢查條件是否滿足
{
Monitor.Wait(lockObject); // 虛假喚醒時,線程會繼續執行這里的代碼
}
}
});
await Task.Delay(1000); // 讓線程開始等待
lock (lockObject)
{
condition = true; // 設置條件滿足
Monitor.Pulse(lockObject); // 喚醒等待的線程
}
task.Wait();
}
}
在這兩個示例中,我們都使用了循環檢查條件是否滿足,這樣即使發生虛假喚醒,線程也會繼續執行循環體內的代碼,直到條件真正滿足為止。