双核机器上的多线程?

cod*_*ddy 7 c++ multithreading

我有一个双核处理器,根据解释,我只能使用2个线程,但实际上我可以同时启动2个以上的线程:

以下是解释的副本:

boost :: thread类提供的静态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;
}
Run Code Online (Sandbox Code Playgroud)

谁能解释这种行为?

Tud*_*dor 21

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

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

您说的由应用程序启动的4个线程来自类别1(用户线程),而该函数返回的值2指的是类别3(硬件线程).由于跨层的映射是N:M,您可以看到可以将多个用户线程映射到较少数量的硬件线程.

说到这一点,如果进行密集计算,通常启动硬件线程数量的2倍以上会因上下文切换和资源争用而损害性能.


inf*_*inf 6

即使在单核计算机上,您也可以始终运行多个线程.但是,它们无法并行运行.(在你的情况下超过2)

例如,一个线程执行GUI,另一个线程从服务器获取一些工作...

请参阅进行更深层次的解释.