使用线程在数组中打印唯一元素

时间:2015-04-28 15:06:51

标签: c++ multithreading pthreads

我有一个M数组的int数组,我想生成N个线程,它们将从中读取至少一个元素并打印它。 条件是 1.每个线程都应该打印唯一的元素 2.每个Thread应至少打印一个元素。    我只是想知道如何实现它。

先谢谢

1 个答案:

答案 0 :(得分:1)

警告:这不仅仅是评论(评论空间的评论太长)而不是对问题的直接回答。

你要问的几乎所有事情的根本问题在于,你想做的几乎所有事情都(大量)依赖于所有数据之间的交互,并且(如果你真的坚持用线程来做)在所有线程之间。 / p>

第一个要求是每个线程从组中选择一个唯一的项目。选择唯一项意味着所有线程至少都知道其他线程将选择哪些数据。

如果你愿意在一个线程中做几乎所有的工作,你可以轻松做到这一点。显而易见的方法是对数据进行排序并删除所有重复项。然后让每个线程选择一个唯一的元素是微不足道的:给每个线程一个要选择的元素的索引,并且它已经完成。

不幸的是,这也意味着线程基本上没有做任何工作。

下一步差不多(可能更糟)。每个线程都需要打印出来的数据。至少假设像std::cout这样的普通流式输出机制,为了防止混乱,你需要使用类似互斥的东西,以确保一次只能打印一个线程,然后是#&# 39; s完成了一些其他线程并打印其输出,依此类推。简而言之, 完全按顺序完成,以保持输出的有意义。

总而言之,所有实际工作最终都是由一个线程在开始时完成,以生成排序的,唯一的数据,最后连续地写出结果。可以并行执行的任务之间的任务是微不足道的,几乎毫无意义。

线程的理想情况在几乎所有方面都与此相反。你想要的是能够非常快速地分割数据,然后在几乎所有实际工作中都有很多线程,而不需要与其他线程同步。

现在,如果您愿意将某些工作投入到一个死胡同的任务中,那么 至少可以通过您已经概述的任务完成其中一些任务。 例如,让我们假设您关心的数据是数字。您可以从一个线程开始,该线程仅将这些数字划分为范围(例如,仅查看最高有效数字)。然后,您可以为每个范围设置一个线程,该线程将这些数字进一步细分(例如,基于下一个数字)。当您将数据划分为您想要的唯一数字范围时,每个线程只从其范围中选择一个数字并打印出来。

对于小数字,使用线程执行此任务可能仍然是一个净损失,但如果你有足够的输入和(特别是)足够大的输入,你真的通过只查看几个数字而不是比较完整数字来获得某些东西,这可能是一场胜利。