【问题标题】:multithreading on dual core machine?双核机器上的多线程?
【发布时间】:2012-02-07 05:55:43
【问题描述】:

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

这里是解释的副本:

静态 hardware_concurrency() 方法,由 boost::thread 类,返回可能的线程数 根据标的数字在同一时间实际执行 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;
}

谁能解释这种行为?

【问题讨论】:

  • 您可以创建任意数量的线程(达到限制),但 2(可能)是最佳数量,每个内核一个。此外,它说“同时物理执行”。您可以制作 2 个以上,但它们不会同时进行物理运行;操作系统必须抢占正在运行的操作系统才能让其他操作系统运行。此外,它说的是“应该”,而不是“可以”。
  • 在双核机器上使用例如 10 线程应用程序有什么副作用?这很糟糕吗?非常感谢。
  • 副作用(可能)仅限于您的应用程序运行速度较慢(因为操作系统必须担心让每个其他线程都有时间运行,而使用 2,它可以让两个线程连续全速运行),尽管这可以通过“一次”做更多的事情来抵消(不是真的一次,而是独立地)。
  • 它为线程管理创建了不必要的开销。
  • 另请注意,这 10 个线程并不孤单。根据任务管理器的说法,我的计算机现在在 58 个进程中运行 732 个线程。话又说回来,这些进程中的大多数可能正在休眠。

标签: c++ multithreading


【解决方案1】:

第一个称为并行编程,第二个是多任务,即使在单处理器机器上也可以完成

【讨论】:

    【解决方案2】:

    最佳结果和可能结果之间存在差异;同时在物理上和理论上运行的线程之间也存在差异。在双核计算机中,有 2 个 CPU,它们能够同时在物理上执行两个线程。但是任何线程系统/线程库的意义在于,您可以根据需要在逻辑上创建尽可能多的线程。这些线程不会真正同时运行,它们会定期切换,以使错觉就好像它们同时运行一样。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        术语线程通常涵盖三个抽象层:

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

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

        话虽如此,如果您进行密集计算,通常启动 2 倍以上的硬件线程数会因上下文切换和资源争用而损害性能。

        【讨论】:

        • +1,很好的解释了不同类型线程之间的关系
        • 是的 +1 我也是。很好的解释。
        【解决方案5】:

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

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

        请参阅this 以获得更深入的解释。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-12-16
          • 2011-03-09
          • 2010-09-05
          • 1970-01-01
          • 1970-01-01
          • 2020-02-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多