当前位置:C++技术网 > 资讯 > C++多线程开发:二、线程的多个状态

C++多线程开发:二、线程的多个状态

更新时间:2016-01-12 18:02:48浏览次数:1+次

        我们为什么需要多线程来解决问题,解决什么问题。刚刚入门的我,真的不知道大伙都用来解决什么问题的。但是我知道的是用户需要界面不卡,那么我们在通信或者处理问题的时候,界面要有一个线程,数据处理需要有另一个线程,那么我们看到效果就是,不卡!

        生活中,我们做一件事以前,都要等待前提条件的完成。我们喝水以前,要把水装上一样。对于cpu来说,它有很多事务需要处理,有些事务必须在其他事务处理完成以后,才能进行,那么等待的那个事务,应该处于怎么样的状态呢?我们打水喝,有三个过程,排队(就绪状态),装水(执行状态),等待老大装完以后再排队装(阻塞状态)。

        我们回到线程来,线程用于完成一些运算,那么它有时候也需要等待某些线程处理完,这时候就进入了阻塞状态。那么某些事情以后,达到运行条件,然后它才进入就绪队列,进入就绪状态。那么等待cpu分配时间片以后,它就可以执行了,进入执行状态

在这几种状态中,我们关注的只有两个,阻塞:等待某件事,执行:执行。

为什么要阻塞,没有阻塞会怎么样?

大家都知道cpu只有一个,也就是资源就是那么有限。那么线程在等待某个东西的时候,可以有两种选择

1、会不断的查:完成了没?完成了没?

这时候,它本身占用着cpu,直到用完为止,那么在他占用期间,其他线程,没有完成工作,还是没有完成工作,它怎么问,结果还是一样:没有完成。(多核多线程CPU就不讨论了,简单点理解)然后把时间片用完。等到下一次它再次获得cpu时间片以后,又再问重复的问题,如果没有达成条件,它又会用完cpu时间,如此重复,十分浪费。

2、那个谁,完成了告诉我,我睡个觉。

睡觉期间,它释放了剩下的cpu时间片,公主进入睡眠状态,等待王子的吻(咳~~认真点),这就是我们熟知的sleep()函数,睡眠一段时间,再起来high。那么这个时候他并没有消耗cpu时间,而是等待这个某事情把它唤醒。那么在这个期间,其他的线程就可以更容易获取更多的cpu时间片,效率就上来了。那么等到有某件事唤醒该线程以后,这线程又可以继续它未完成的任务了。

当我们写while(1){}循环的时候,大多数会无意中采用非阻塞的做法。程序能运行得到结果,但是效率却不高。有时候我们也会采用while(1){sleep(0);}。比上面一种做法好一点。我们通常会写While(WaitForSignalObject()){}。最后这种就是阻塞方式。

有多个线程,分别做不同的事,有逻辑地高效地进行处理,这就达到我们学习的目的。然而后面的路还很长。