代码之家  ›  专栏  ›  技术社区  ›  ghiboz

微处理器的c++线程划分

  •  2
  • ghiboz  · 技术社区  · 14 年前

    我有个问题。。。我需要建立一个应用程序多线程,我的问题是:如果我有一个2cpu处理器,是不是自动地我的两个线程是分开的一个处理器? 如果我有4个线程,而我的电脑有4个CPU,那么每个处理器是否也有1个线程?如果我有4个处理器和2个CPU,如何划分??

    提前谢谢

    3 回复  |  直到 14 年前
        1
  •  7
  •   paxdiablo    14 年前

    这不是一个真正可以回答的问题,除非您至少指定了操作系统。

    C++本身对线程一无所知,它们是OS提供给执行环境的服务,并依赖于OS来实现。

    作为一般观察,我非常确定Linux独立地调度线程,以便多个线程可以分布在不同的cpu和/或内核上。我怀疑Windows也会这么做。

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

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

    但是,通常情况下,你会发现最好不要管这些事情,让操作系统来处理——除非你对不同的行为有特殊的需求,否则操作系统几乎肯定会做出正确的决定。

        2
  •  4
  •   Sean    14 年前

    线程分配给处理器的方式取决于应用程序运行的操作系统。一般来说,大多数操作系统不会保证线程是如何在处理器之间进行拆分的,尽管有些操作系统有一些低级的api允许您指定线程关联性。

        3
  •  2
  •   Chris Becke    14 年前

    如果您的线程是CPU绑定的,那么它们肯定会被安排在所有可用的CPU上。

    如果线程是IO绑定的,那么如果每个CPU只有一个线程,那么大多数CPU都将处于空闲状态。这就是为什么当尝试最大化性能时,重要的是要测量正在发生的事情,或者找到每个CPU的线程的硬编码比率,或者使用操作系统线程池机制,它可以访问足够的信息以保持与CPU内核一样多的线程活动。

    你通常不希望有比CPU更多的活动线程(即,在等待IO完成时不会被阻塞的线程),因为在CPU上的活动线程之间进行切换的行为确实会产生很小的成本,这可能会增加。