编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推

来源:互联网 发布:阿里云机顶盒root工具 编辑:程序博客网 时间:2024/04/25 18:17

        编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推。      

        好长时间没有再想写代码了,虽然自己还没有毕业,处于学习的阶段,但是很少是主动的写过多少,代码量太少是一大障碍。在不久就面临毕业找工作,刚才看了许久的各大公司的笔试题,看懂的没有几道,会的更少。自己弱爆了,怎么办。在这里,我把自己会的尽量写,借此激励自己。 

      老师讲的这是迅雷的笔试题: 是不是无关紧要,主要是上次考试的时候这就是最后一道题,要求用手写确实不容易.

     题意很明了,要求也很简单,自己傻逼一样一看就笑了,用一个sleep()愉快的完成了这道题,感觉还很牛B..下面是当时自己在试卷上的作答:结果是把每个线程的编号打印三遍,但是用sleep确实没有什么意思,所以这么做只能得0分。创建线程的时候用了usleep(50)不然打印出结果就是错的,sleep本身就不精确。没多少线程控制的含量,没有用到互斥锁和条件变量。

假设有三个线程A, B, C;A线程首先执行,B线程等待A结束后执行,C线程等待B结束后执行,A线程又要等待C线程结束后执行,B再等待A,C再等待B....以此类推,是一个循环等待的过程,每一个线程要做的事情:1.抢到锁,设置标志位为1(告诉上家自己在等待信号);2.收到上家的信号,立即设置标志为为0,并打印出自己的线程号;3.确定下家是否在等待,确定下家在等待后,立即发送信号给下家,再打开锁,usleep(20)(让其他线程抢到锁)。

其中有两个要注意的地方:1.三个线程创建好后,三个线程都在死等待 [A等C,B等A,C等B] 所以首先手动代替C为A发送信号,让程序执行。2.A线程的10次循环结束后,flag标志位是0,而此时C线程还没有执行完毕,C要检查A的标志为是否为1再给A发送信号,所以在A循环结束后把它的flag标志为置为1。

看程序:

程序顺利执行,结果正确。但是代码冗余很大,可扩展性不好,在下面做改进。。


改进版的, 把A,B,C先程中的大量重复部分封装成一个函数,用循环创建和回收线程。

上一个封装的不好,最后一个版本老师给的,封装的更好一些:

原创粉丝点击