c - 时间片的问题

标签 c multithreading pthreads

我试图查看时间切片的效果。以及它如何消耗大量时间。其实我是想把某个工作分成线程数,看看效果。

我有一个双核处理器。所以两个线程可以并行运行。我想看看我是否有一个由 2 个线程完成的工作 w,以及​​我是否有 t 个线程完成的相同工作,每个线程都在做 w/t 工作。时间分片在其中起到多大的作用

由于时间分片是一个耗时的过程,我原以为当我使用双线程进程或t线程进程做同样的工作时,t线程进程花费的时间会更多

然而,我发现并不是这样的。我试过 t=10。而且它仍然比 2 线程进程快。例如。如果我必须进行 10,000,000 次迭代,使用两个线程进程,我将让 2 个线程进行 5,000,000 次迭代,这样我们总共有 10,000,000 次迭代。如果我必须处理 10 线程进程,我会让每个线程执行 1,000,000 次迭代,这样我们的总数也是 10,000,000 次。

我原以为 10 线程进程会消耗更多时间。但事实并非如此。代码中有错误吗?我觉得还不错

有什么建议吗?

最佳答案

要让应用在线程数量多于处理器数量的情况下表现出显着的、易于衡量的减速,您必须努力解决:

1) 线程必须是 CPU 密集型的,即。不阻塞 I/O 或彼此。如果您使用的是简单的计数循环(听起来您就是这样),那么是的,完成了。

2) 您必须安排每个线程处理足够大的数据,以便 L1 缓存需要在上下文交换时进行大量刷新。如果您只增加一个整数,则不会发生这种刷新,并且上下文切换开销会太小(与计时器驱动的调度运行之间的间隔相比),无法轻松演示。

Windows 示例数据,最小缓存刷新,i7,4/8 核:

8 tests,
400 tasks,
counting to 10000000,
using 8 threads:
Ticks: 2199
Ticks: 2184
Ticks: 2215
Ticks: 2153
Ticks: 2200
Ticks: 2215
Ticks: 2200
Ticks: 2230
Average: 2199 ms

8 tests,
400 tasks,
counting to 10000000,
using 32 threads:
Ticks: 2137
Ticks: 2121
Ticks: 2153
Ticks: 2138
Ticks: 2137
Ticks: 2121
Ticks: 2153
Ticks: 2137
Average: 2137 ms

8 tests,
400 tasks,
counting to 10000000,
using 128 threads:
Ticks: 2168
Ticks: 2106
Ticks: 2184
Ticks: 2106
Ticks: 2137
Ticks: 2122
Ticks: 2106
Ticks: 2137
Average: 2133 ms

8 tests,
400 tasks,
counting to 10000000,
using 400 threads:
Ticks: 2137
Ticks: 2153
Ticks: 2059
Ticks: 2153
Ticks: 2168
Ticks: 2122
Ticks: 2168
Ticks: 2138
Average: 2137 ms

关于c - 时间片的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12229806/

相关文章:

iphone - 如何停止失控的进程

c++ - POSIX 线程在 C 中没有产生加速

c - 将毫秒添加到 C 日期

c - 记录 C 结构的程序?

c++ - 遍历数组以线性时间找到第二大元素

java - 为什么需要在 java 中使用非守护线程?

java - 通过 JNA 调用 native 库时的并发问题

c++ - LNK1104 : Cannot open file pthreadsVC2. 库

java - 并发:缓存一致性问题还是编译器优化?

c++ - 在 WM_PAINT 之后调整窗口大小以适合内容