【发布时间】: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