我有想法检测PC的内核数量,但我不确定它是否有效。这是代码:
int sleepSec = 2; // 2 sec
void funcSleep()
{
sleep(sleepSec);
}
const int SIZE = 4;
threadArr arr[SIZE];
int begin_time = getCurrentTime();
for(int i = 0; i < SIZE; i++)
{
arr[i] = thread_create(funcSleep);
}
for(int i = 0; i < SIZE; i++)
{
thread_join(arr[i]);
}
int end_time = getCurrentTime();
print("The number of cores = ");
print(sleepTime * SIZE / (end_time - start_time));
如果我们忽略所有延迟,我认为上面的代码可以告诉我PC的核心数量。
总之,如果管理多线程的策略是:如果可能的话,将线程分配给未使用的核心。代码应该运行良好 如果没有,你能解释一下PC如何处理多线程吗?
答案 0 :(得分:0)
不可靠。当一个线程处于休眠状态时,可以在同一个核心上调度(执行)其他线程。
在单核机器上,将安排第一个线程。在几微秒内,睡眠系统调用将意味着内核调度程序驱逐了该进程(因为它在接下来的2秒内不会做任何有用的事情,所以不妨让其他进程同时运行)。然后,将安排另一个过程,最终是你的一个。这将调用sleep系统调用,并调度第三个进程。如果计算机空闲,您的程序将在任何计算机上运行大约2秒。
您可以执行系统调用,明确返回计算机中的整数cpu。
N.B。没有睡眠系统调用;事实上,每当睡眠线程被调度时,他们会看时间,意识到他们没有睡得足够长,并将控制权交还给内核调度程序,驱逐自己以便其他东西可以运行。
答案 1 :(得分:0)
线程分配给核心的方式是特定于实现的。绝不保证每个线程都被分配了不同的核心,即使有足够的可用核心。
大多数JVM实际上会尝试这样做,但例如空闲 - 例如睡眠 - 线程可以与其他线程共享核心。
如果要查找核心数,可以
Runtime.getRuntime().availableProcessors();
但,Java RT可能设置为使用少于可用内核的数量。 This article讨论了如何在Windows 7下更改JVM的处理器关联性。
此外,超线程可能会使显然可用内核的数量翻倍。
因此,Java中没有通用的,符合标准的方法来确定系统上的确切核心数。