自旋
SpinWait结构:自旋意味着让一个线程暂时“原地等待” 。线程会一直运行占用CPU。自旋适用于多核计算机。只阻塞极短的时间段,小任务场景里。自旋并不会一直占用CPU,如果自旋的时间过长,会自动释放占用的CPU。SpinWait结构提供了NextSpinWillYield属性。当其值为真时,调用SpinOnce方法自旋会退出占用的CPU。
static volatile bool isCompleted = false; static void SpinWaitTest() { var m = new SpinWait(); while (!isCompleted) { Console.WriteLine(m.NextSpinWillYield); m.SpinOnce(); } Console.WriteLine("Waiting spin is complete"); } static void Main(string[] args) { var t2 = new Thread(SpinWaitTest); isCompleted = false; Console.WriteLine("spin running"); t2.Start(); Thread.Sleep(10000); isCompleted = true; Console.Read(); }

可以看到CPU只有短时间的升高就回落了自旋已经让出了CPU。
public class InitPools
{
private int Excuting= 0;
public void AllocT()
{
ThreadPool.QueueUserWorkItem(w => Excuated());
if(Excuting==1)
{
var spinWait = new SpinWait();
while (true)
{
spinWait.SpinOnce();
if (Excuting!= 1)
AllocT();
}
}else AllocT();
}
public void Excuated()
{
if (Interlocked.CompareExchange(ref _inExpanding, 1, 0) != 0)
return false;
Doing();
Excuting=0;
}
}

浙公网安备 33010602011771号