我有以下代碼
class Program
{
static SpinLock sl = new SpinLock();
public static void Foo(object arg)
{
bool r = false;
sl.Enter(ref r);
}
public static void Main(string[] args)
{
bool r = false;
sl.Enter(ref r);
ThreadPool.QueueUserWorkItem(Foo);
Thread.Sleep(5000);
sl.Exit();
Thread.Sleep(5000);
}
}
當我執行它時,在整個程式運行程序中,我看到大約 0% 的 CPU 負載。由于sl.Enter()呼叫內部的旋轉,我希望看到一些 CPU 消耗,但事實并非如此。
根據SpinLock 來源,它SpinWait在幕后使用,而后者實際上Thread.Sleep(1)在某個時候呼叫。
這是否意味著,雙方SpinLock并SpinWait沒有真正的“微調”,而是仍然要訴諸OS調度器來產生一些CPU份額?
編輯
這個問題可以用以下方式重新表述:
使用忙回圈可確保一個執行緒釋放鎖和另一個執行緒獲取鎖之間的時間最短。在這方面我可以依賴SpinLock/SpinWait嗎?據我所知,答案是否定的,因為它Sleep至少會持續 1 微秒,并且在此期間鎖可能會在某處被釋放。
uj5u.com熱心網友回復:
關于您編輯的問題,是的,忙碌的旋轉將為您提供執行緒之間最低的通信延遲,但您將通過消耗 CPU 時間來為此付出代價。
另一方面,您可以使用SpinWait哪個不那么激進,或者您可以撰寫介于兩者之間的代碼,例如this。
這歸結為您對延遲的重視程度和必須保留的核心數量的權衡。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/382690.html
上一篇:從執行緒中洗掉重復的行
