做法很簡單,Process及Thread的優先權都拉到最高,一口氣開八條Thread用空轉的while迴圈吃光CPU。為了比較差異,高優先權模式可透過參數決定是否啟動。程式如下:
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading;
namespace SystemHang
{
class Program
{
static void Main(string[] args)
{
//由傳入參數決定要不要讓Windows卡卡
bool freeze = (args.Length > 0 && args[0] == "freeze");
var p = Process.GetCurrentProcess();
//卡卡模式時,將Process優先等級拉到RealTime
//註: 實務上幾乎沒有需要設定RealTime的情境(叔叔有練過,小朋友不要學)
if (freeze)
p.PriorityClass = ProcessPriorityClass.RealTime;
//建立八條Thread,就算i7有四核八緒的也要趕盡殺絕
Thread[] threads = new Thread[8];
//使用ManualResetEvent做執行緒同步
ManualResetEvent[] waits = new ManualResetEvent[threads.Length];
//設定刑求時間10秒
DateTime timeUp = DateTime.Now.AddSeconds(10);
for (int i = 0; i < threads.Length; i++)
{
var wait = waits[i] = new ManualResetEvent(false);
threads[i] = new Thread(() =>
{
//於時限內形成空迴圈,讓條件比對耗盡CPU資源
while (DateTime.Now.CompareTo(timeUp) < 0)
{
//什麼都不做,讓迴圈快速轉動
}
//通知執行完畢
wait.Set();
});
//卡卡模式時,指定執行緒優先等級為Highest
if (freeze)
threads[i].Priority = ThreadPriority.Highest;
//啟動執行緒
threads[i].Start();
}
//等待所有執行緒執行完畢
WaitHandle.WaitAll(waits);
Console.WriteLine("Done!");
}
}
}
程式跑了兩次,執行期間8顆CPU負載全滿,差別在於第一次使用預設優先權,滑鼠還能自由移動,下方的Up Time也如常累計;而第二次將優先權提高後,滑鼠很難移動,而下方的Handles、Threads、Processes、Up Time等統計停止更新,CPU的負載曲線圖表也不動,直到程式結束才恢復。