使用打印不同范围的3个线程按排序顺序打印数字

时间:2011-08-16 19:49:45

标签: c++ multithreading

在ElectronicArts的采访中提到了这个问题。

  

有3个主题。第一个线程打印1到10个数字。第二个线程打印从11到20的数字,第三个线程打印从21到30.现在所有三个线程都在运行。然而,数字以不规则的顺序打印,如1,11,2,21,12等。

如果我想按照排序顺序打印数字,比如1,2,......我该如何处理这些线程?

3 个答案:

答案 0 :(得分:3)

使用线程可以挂起的共享条件对象。条件可以是3种状态中的任何一种:0,1,2。条件初始化为状态0. 1-10线程与状态0相关联,11-20线程与状态1相关联,最后一个线程是与状态2相关联。每个线程在启动时检查条件并在条件状态与线程关联的状态不同时挂起。一次只允许一个线程运行并打印其范围。当一个线程打印了它的范围时,它会增加条件的状态,唤醒线程等待它并终止。这应该可以解决问题。

如果不允许线程挂起,则让它们轮询代表3个线程的“有序调度”的共享对象。

另一种方法可能是链接线程:让第二个线程阻塞直到第一个终止,第三个阻塞直到第二个线程完成。此解决方案不需要共享对象,但每个线程都需要知道其前任

答案 1 :(得分:1)

对于barrier来说似乎很自然。三个过程,两个障碍(称为barrier10barrier20)。

流程1:

Print 1-10
Wait on barrier10
Wait on barrier20
Exit

流程2:

Wait on barrier10
Print 11-20
Wait on barrier20
Exit

流程3:

Wait on barrier10
Wait on barrier20
Print 21-30
Exit

答案 2 :(得分:0)

也许所有三个线程用来打印其数字的单个静态方法应该锁定,检查已打印的数字,如果其编号已准备好打印,则打印并继续,否则解锁并屈服。