大多数时候,您根本不想将单独的线程用于简单的序列,例如对字符串进行标记,然后将标记转换为双精度。
相反,当您在线程之间拆分任务时,您希望找到不需要按顺序完成的事情。恰恰相反,您通常希望尽可能减少线程之间的交互。
因此,不是让一个线程标记化,另一个转换为双精度,您通常更喜欢将标记化和转换一起进行双精度,但将输入分成几个大数据块,每个如果哪个会由单个线程处理。
即便如此,最终也可能没有什么(如果有的话)真正的好处。我首先在一个线程中编写代码,然后进行一些分析。鉴于标记化和转换数据所涉及的处理量很小,单个线程很有可能能够以足够快的速度进行处理以使用所有可用的内存带宽。在这种情况下,除非您使用的系统可能(例如)在完全独立的处理器上运行多个线程,否则使用更多线程不太可能有真正的好处,因此您的可用内存带宽可以扩展(至少在某种程度上)以及您使用的核心。
多个线程将(至少可能,并且通常实际上也是)在多个内核上运行。parallel_for
/parallel_for_each
旨在简化某些特殊情况的并行处理,因此您可以获得多线程的效果,而无需跳过几乎一样多的火焰箍以确保正确的行为。
std::thread
当您希望线程进行异构处理时,确定使用而不是 parallel_for (或类似)的明显标准是。parallel_for 基本上只接受循环的迭代并并行执行它们。如果您的处理(大部分)没有发生在这样的单个循环中,std::thread
则可能会产生更好的结果。