NO_OF_PROCESSORS
显示 4,因为您的 CPU 具有超线程。超线程是英特尔的技术商标,它使单个内核能够或多或少地同时执行同一应用程序的 2 个线程。只要一个线程正在获取数据而另一个线程正在访问 ALU,它就可以工作。如果两者都需要相同的资源并且指令无法重新排序,则一个线程将停止。这就是您看到 4 个核心的原因,即使您有 2 个。
动态内存仅可用于其中一个内核,IMO 不太正确,但寄存器内容和有时缓存内容是正确的。驻留在 RAM 中的所有内容都应该可供所有 CPU 使用。
比 CPU 更多的线程可以提供帮助,具体取决于您的操作系统调度程序的工作方式/您访问数据的方式等。要找到您必须对代码进行基准测试。其他一切都只是猜测。
除此之外,如果您正在尝试学习 Qt,那么担心这可能不是正确的事情......
编辑:
回答您的问题:如果您增加线程数,我们无法真正告诉您程序运行的速度有多慢/多快。取决于你在做什么,这会改变。例如,如果您正在等待来自网络的响应,则可以更多地增加线程数。如果您的线程都使用相同的硬件,4 个线程的性能可能不会比 1 个更好。最好的方法是简单地对您的代码进行基准测试。
在理想的世界中,如果您“只是”在运行 4 或 8 个线程时处理数字不应该有什么不同,那么净时间应该是相同的(忽略上下文切换的时间等),只是响应时间会有所不同。问题是没有什么是理想的,我们有缓存,你的 CPU 都在同一条总线上访问相同的内存,所以最终它们会竞争对资源的访问。然后,您还有一个操作系统,它可能会或可能不会在给定时间安排线程/进程。
您还要求解释同步开销:如果您的所有线程都访问相同的数据结构,您将不得不进行一些锁定等操作,以便在更新时没有线程访问处于无效状态的数据。
假设你有两个线程,都做同样的事情:
int sum = 0; // global variable
thread() {
int i = sum;
i += 1;
sum = i;
}
如果同时启动两个线程执行此操作,则无法可靠地预测输出:它可能会像这样发生:
THREAD A : i = sum; // i = 0
i += 1; // i = 1
**context switch**
THREAD B : i = sum; // i = 0
i += 1; // i = 1
sum = i; // sum = 1
**context switch**
THREAD A : sum = i; // sum = 1
最后sum
是1
,2
即使你启动了两次线程。为避免这种情况,您必须同步sum
对共享数据的访问。通常,您可以通过根据需要阻止访问来做到这一点sum
。同步开销是线程等待资源再次解锁、什么都不做的时间。
如果每个线程都有离散的工作包并且没有共享资源,则应该没有同步开销。