我刚开始学习“用C#线程化”。 我在一本书中发现Thread.Sleep(0)立即,自愿放弃线程的当前时间片 将CPU移交给其他线程。
当我写几行代码来测试它时。我没有得到预期的结果。这是我写的代码。
class Program
{
static void Main(string[] args)
{
Thread.CurrentThread.Name = "Thread A(main thread)";
Thread thread = new Thread(PrintNumber);
thread.Name = "Thread B";
thread.Start();
for (int i = 0; i < 40; i++)
{
Console.WriteLine("{0} | i = {1}", Thread.CurrentThread.Name, i);
}
}
void PrintNumber()
{
for (int i = 0; i < 40; i++)
{
Console.WriteLine("{0} | i = {1}", Thread.CurrentThread.Name, i);
if (i == 4)
{
Thread.Sleep(0);
}
}
}
}
根据我的理解,这将在线程B中打印最多4个,然后它将恢复线程A.下一个线程调度是不可预测的。 但这不会发生。虽然第一次涉及到线程B,但有时它打印最多6个,有时8个意味着完全不可预测。
我对Theread.Sleep(0)的概念是错误的吗?有人可以澄清这个概念吗
答案 0 :(得分:3)
如果 释放线程的切片,并不意味着你可以预测它的去向 - 它可以转到上的任何进程计算机。特别是,假设您有一台多核机器,另一个线程可能完全由另一个核心提供服务。在显示的代码中,"Thread B"
甚至可能在Main
的循环附近都没有启动。启动一个线程不是即时的。
很少有Thread.Sleep(0)
对您有用的场景,所有这些场景都涉及对线程和内存模型的广泛知识。
答案 1 :(得分:2)
Thread.Yield()
确保正在执行的下一个线程不是当前线程。