【发布时间】:2015-06-29 00:08:01
【问题描述】:
今天,我进入了多线程。由于这是一个新概念,我想我可以通过将一个简单的迭代转化为一个并行化的迭代来开始学习。但是,我想我还没开始就卡住了。
最初,我的循环看起来像这样:
let stuff: Vec<u8> = items.into_iter().map(|item| {
some_item_worker(&item)
}).collect();
我在items 中放入了相当多的东西,完成计算大约需要 0.05 秒。所以,当我成功实现多线程后,看到时间减少了,我真的很兴奋!
当我使用线程时,我遇到了麻烦,可能是因为我的推理错误。
use std::thread;
let threads: Vec<_> = items.into_iter().map(|item| {
thread::spawn(move || {
some_item_worker(&item)
})
}).collect(); // yeah, this is followed by another iter() that unwraps the values
我有一个四核 CPU,这意味着我最多只能同时运行 4 个线程。我猜它是这样工作的:一旦迭代器启动,就会产生线程。每当一个线程结束时,另一个线程就会开始,因此在任何给定时间,4 个线程同时运行。
结果是(在重新运行后)大约 0.2 秒才能完成相同的计算。显然,这里没有进行并行计算。我不知道为什么时间增加了4倍,但我确定我误解了一些东西。
既然这不是正确的方法,我应该如何修改程序以使线程同时执行?
编辑:
对不起,我错了大约 0.2 秒。当我注意到通常的迭代运行了 2 秒时,我醒来并再次尝试。事实证明,某些进程一直在疯狂地消耗内存。当我重新启动系统并再次尝试线程迭代时,它运行了大约 0.07 秒。以下是每次运行的一些时间安排。
实际迭代(第一次):
0.0553760528564 seconds
0.0539519786835 seconds
0.0564560890198 seconds
线程一:
0.0734670162201 seconds
0.0727820396423 seconds
0.0719120502472 seconds
我同意线程确实在同时运行,但完成这项工作似乎又需要 20 毫秒。我的实际目标是利用我的处理器并行运行线程并尽快完成工作。这会很复杂吗?我应该怎么做才能使这些线程并行运行,而不是并发运行?
【问题讨论】:
-
如果程序受内存限制而不是 CPU 限制,那么多线程将无济于事,并且可能由于缓存冲突而减慢速度。多线程对于 CPU 密集型计算很有用,或者作为异步 I/O 的替代方法来分离设备(其中每个线程执行常规 I/O 并等待设备)。
-
实际上很不清楚你在问什么。您的标题是提到同步,但随后您的身体会询问如何让事情同时发生。线程间同步是一个很大的话题,但您似乎并没有问这个问题。
-
@Shepmaster 是的,这令人困惑。现在修复:)
-
有多少项,即每个
some_item_worker需要多长时间?产生一个线程并等待它完成需要时间。如果每个线程只做非常少量的工作,那么生成大量线程很容易降低性能。 -
这并不一定意味着您根本无法进行并行化,您只需要生成更少的线程并让每个线程有更多的工作要做。
标签: multithreading concurrency rust