线程线程杂谈(1)
讨论的问题:
网络编程中模型在所难免会遇到这样情况:在线程中需要不断的收取数据并进行处理,对于任何编程语言,如果不用事件、异步、委托等方式处理的,那就只能用查询方式了;如果线程查询中方式没有不阻塞,会出现什么情况?
说明:不阻塞有以下两种含义:
(1) 没有阻塞的意思是把阻塞函数设置成为了非阻塞;
(2)线程中也没有加入延时操作函数进行阻塞;
下面以C#的线程为例:
Thread t = new Thread(new ThreadStart( mainloop));
t.IsBackground = true;
t.Start();
private void mainloop()
{
while(true)
{
;
}
// Thread.Sleep(100);
}
}
这样程序就会造成电脑CPU使用率激增,对于单核电脑基本能达到100%;我的PC是4核的,使用立马增到41.9%;造成这样的原因就是程序在空转,由于没有阻塞处理,程序占用了太多的时间片;
如果在循环中加入100ms延时的阻塞会出现什么情况呢:
发现程序CPU的占用率基本就为0%了;
最后:线程死循环+短时间阻塞或者不阻塞什么场景会使用?
(1)不阻塞可以在嵌入式单板中使用,目前着手的项目中有这样程序,并且稳定运行;因为就一个应用程序,这样做也无可厚非;
(2)如果在PC上使用的话,请加上1ms级别的延迟,这样就能把CPU使用率降低下来了;
总结,如果不想使用这种架构,那么就要考虑事件模型了;