2012-01-10 192 views
7

我有一个双核心处理器,根据说明我只能使用2个线程,但实际上我能够同时启动2个以上的线程:双核心机器上的多线程?

这里是一个解释的副本:

静态hardware_concurrency()方法,由 升压::线程类提供时,返回可以 物理上基于CPU或CPU内核的底层数 同时执行的线程的数目。在常用的 双核机器上调用此函数,返回值2。这允许简单的 方法来确定给定的多线程应用程序应该同时使用 的理论最大线程数。

hardware_concurrency()方法在我的情况下返回2号,但这个程序使用4个线程在同一时间:

#include <iostream> 
#include <boost\thread.hpp> 

using namespace std; 
using boost::thread; 
using namespace boost::this_thread; 
using boost::posix_time::seconds; 

void f1() 
{ 
    for(int i = 0; i < 10; ++i) 
    { 
     cout << i << endl; 
     sleep(seconds(2)); 
    } 
} 

void f2() 
{ 
    for(int i = 0; i < 10; ++i) 
    { 
     cout << i << endl; 
     sleep(seconds(2)); 
    } 
} 

int main() 
{ 
    // 4 threads are executed on dual core machine (no problem) 
    thread thr1(f1); 
    thread thr2(f2); 
    thread thr3(f1); 
    thread thr4(f2); 
    cin.ignore(); 
    return 0; 
} 

任何人都可以解释这种行为?

+7

,只要你想(到了极限)可以使尽可能多的线程,但2完成(可能)最佳数量,每个核心一个。另外,它说“同时实际执行”。你可以超过2个,但他们不会同时运行;操作系统将不得不抢先运行,让其他人运行。另外,它说“应该”,而不是“可以”。 – 2012-01-10 20:02:26

+0

以及在双核机器上使用例如10个线程应用程序会产生哪些副作用?那是不是好?非常感谢。 – codekiddy 2012-01-10 20:04:39

+1

副作用(可能)仅限于您的应用程序运行速度较慢(因为操作系统不得不担心让每个其他线程都有时间运行,其中有2个,它可以让它们全速运行),尽管这可能会抵消通过能够“同时”做更多(不是一次,而是独立)。 – 2012-01-10 20:05:45

回答

19

术语线程通常包括三个抽象层:

  1. 用户线程是由应用程序启动的线程,并且被映射N:M到:
  2. 内核线程,其是由所述托管线程操作系统映射到N:M到:
  3. 硬件线程,它们是可用的实际物理资源。

应用程序启动的4个线程是由类别1(用户线程)启动的,而由该函数返回的值2则指向类别3(硬件线程)。由于跨层的映射为N:M,因此可以看到可以将多个用户线程映射到较少数量的硬件线程。说到这一点,如果您正在进行密集型计算,通常会启动超过2倍的硬件线程数量,这会由于上下文切换和资源争用而损害性能。

+1

+1,不同类型的线程之间的关系很好的解释 – 2012-01-10 20:07:26

+0

是啊+1从我也是。很好的解释。 – 2012-01-10 20:09:44

+0

非常感谢你的解释。 – codekiddy 2012-01-10 20:17:31

6

即使在单核机器上,您也可以始终运行多个线程。尽管如此,它们不能并行运行。 (超过2你的情况)

例如,一个线程做的GUI,另取一些工作从服务器...

进行更深层次的解释见this

1

您可以使用比处理器内核多的线程。这可以带来以下好处:您可以隐藏通信(例如,文件I/O或网络)与计算,或在时间片系统中获得更多处理器时间。使用两个内核时,只有两个线程将同时在物理上执行,但拥有更多线程可以提高性能。这是你需要调整的东西。

1

最佳结果和可能结果之间存在差异;同时在物理和理论上运行的线程之间也存在差异。在双核计算机中,有两个CPU,可以同时在物理上执行两个线程。但任何线程系统/线程库的重要性在于,您可以根据需要在逻辑上创建线程。这些线程并不会在同一时间运行,它们会周期性地切换,以产生幻觉,仿佛它们同时运行。

1

第一个叫paralell程序,第二个是多任务处理,可即使在单处理器机器