C++线程划分到微处理器

问题描述:

我有一个问题...我需要建立一个应用程序的多线程,我的问题是:如果我有一个2cpu处理器,是自动的,我的2线程是分开的一个处理器? 如果我有4个线程,我的电脑有4cpu,每个处理器又是1个?如果我有4个处理器和2个cpus,如何分割?C++线程划分到微处理器

在此先感谢

这是不是真的可以,除非你至少指定操作系统来回答的问题。

C++本身一无所知线程,它们是由操作系统执行环境提供的服务,并依靠该操作系统为它的实施上。

作为一般的观察,我敢肯定的是,Linux的调度线程独立,使多个线程可以在不同的CPU和/或核心传播。我怀疑Windows会这样做。

有些OS”将允许您指定线程亲和力,坚持使用单一的CPU,但同样的能力线程(有时线程组),这是一个操作系统问题,而不是C++的。

对于Windows(根据您的评论),你可能需要阅读this introduction。 Windows提供了一个SetProcessAffinityMask()函数用于控制给定进程中所有线程的关联性,或用于控制独立线程的SetThreadAffinityMask()

但是,通常情况下,你会发现这是最好的离开仅仅这些,让OS排序出来 - 除非你有不同的行为的特定需求,操作系统几乎肯定会做出正确的决定。

+0

对不起,我用Visual C++和我创建第二个窗口 – ghiboz 2010-11-16 08:26:43

+0

+1我的程序的建议,只要你不真的需要它独自离开的过程亲和力掩码。 (当读取高精度时间是不幸的需要) – daramarak 2010-11-16 09:43:20

线程如何分配给处理器是特定于您的应用程序运行的操作系统。通常,大多数操作系统不会对你的线程在处理器中的分配方式做出任何保证,尽管一些操作系统有一些低级API允许你指定线程亲和性。

+0

谢谢sean ...并且对于windows,您是否知道API? – ghiboz 2010-11-16 08:27:20

+0

我认为这是SetThreadAffinityMask – Sean 2010-11-16 08:30:17

+1

@ghiboz:请注意,调用'SetThreadAffinityMask'的时候_quite_不常见。通常Windows可以比你做得更好,因为它可以轻松地将所有进程中的所有线程考虑在内。 – MSalters 2010-11-16 08:57:11

如果你的线程是CPU绑定的,那么他们肯定会倾向于在所有可用的CPU上安排。

如果您的线程是IO绑定的,那么如果每个CPU只有一个线程,则大多数CPU将闲置。这就是为什么 - 当试图最大化性能时 - 衡量正在发生的事情很重要,要么找到每个CPU的硬编码比率,要么使用操作系统线程池机制,该机制可以访问足够的信息以保持尽可能多的线程因为有CPU核心,所以是活动的。

您通常不希望拥有更多活动线程,即CPU(即未等待IO完成的线程)因为CPU上活动线程之间切换的行为确实会产生可累积的小成本。