Quantcast
Channel: 黑暗執行緒
Viewing all articles
Browse latest Browse all 2458

Coding4Fun: 讓Windows桌面凍結的.NET程式

$
0
0

在Huan-Lin學習筆記看到一篇文章 -- C# 學習筆記:多執行緒 (3) - 優先順序。用.NET跑多執行緒對我不算陌生,但卻一直沒注意到.NET的Process跟Thread的Priority是可以調整的。.NET執行緒預設的優先權是Normal,而Windows核心層次的作業(例如滑鼠、鍵盤訊息處理)多半能擁有更高的優先權,無怪乎過去就算寫.NET程式如何搾乾CPU,Windows的基本操作仍能維持順暢。

學到這招讓我動起邪惡的念頭 -- 來寫支可以凍結Windows桌面的.NET程式吧!

做法很簡單,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
    {
staticvoid 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的負載曲線圖表也不動,直到程式結束才恢復。

無聊的小實驗,可以看出優先權高低造成的影響,也由此可知: 除非你有很好的理由,沒事別提高Thread優先權,只會惹人嫌。


Viewing all articles
Browse latest Browse all 2458

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>