线程基础示例代码之SpinWait
2018-06-26 本文已影响0人
JameLee
我们在处理一个线程时,若需要同步等待时,以往可能会常用 Thread.Sleep
将CPU
时间让给其他线程使用。但如果需要等待某个条件满足的时间很短,而且不希望发生上下文切换,基于自旋的【等待】是一种很好的解决方案
-
SpinWait
: 自旋等待 -
SpinUntil
: 等待某个条件发生
如果发生了长时间的自旋,SpinWait
会让出底层的时间片,并触发上下文切换。
因为长时间的自旋会阻塞优先级更高的线程。当一个线程自旋时,它会将一个内核放入到一个繁忙的循环中,而且它不会让出处理器时间片的剩余部分。
SpinWait
的智能逻辑中会在自旋达到足够长的时间时停止自旋并让出处理器。当然可以考虑调用Thread.Sleep()
方法,它会让出处理器时间,但开销比较大。
示例代码如下
using System;
using System.Threading;
using System.Threading.Tasks;
public class App {
private static bool isEnvironmentInit = false;
/// <summary>
/// 模拟环境初始化之后需要做的工作
/// </summary>
private static void DoWork() {
SpinWait.SpinUntil(() => isEnvironmentInit);
Console.WriteLine("环境已在主线程中初始化...");
{
// 业务逻辑代码
Console.WriteLine("业务逻辑代码...");
}
}
static void Main(string[] args) {
Task.Run(() => {
DoWork();
});
// 模拟环境初始化过程
Thread.Sleep(3000);
isEnvironmentInit = true;
Console.WriteLine("环境初始化完成");
Console.ReadLine();
}
}
运行结果如下
环境初始化完成
环境已在主线程中初始化...
业务逻辑代码...
欢迎关注公众号【嘿嘿的学习日记】,所有的文章,都会在公众号首发,Thank you~
公众号二维码.jpg