gpt4 book ai didi

c++ - Linux 上的 PThreads 和多核 CPU

转载 作者:IT老高 更新时间:2023-10-28 21:41:11 25 4
gpt4 key购买 nike

我正在编写一个使用线程来提高性能的简单应用程序。问题是,这个应用程序在 Windows 上运行良好,使用我的 CPU 的 2 个内核。但是当我在 Linux 上执行时,似乎只使用了 1 个核心。

我不明白为什么会这样。

这是我的代码,C++:

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <time.h>

void* function(void*)
{
int i=0;
for(i=0; i<1110111; i++)
rand();
return 0;
}

void withOutThreads(void)
{
function(0);
function(0);
}

void withThreads(void)
{
pthread_t* h1 = new pthread_t;
pthread_t* h2 = new pthread_t;
pthread_attr_t* atr = new pthread_attr_t;

pthread_attr_init(atr);
pthread_attr_setscope(atr,PTHREAD_SCOPE_SYSTEM);

pthread_create(h1,atr,function,0);
pthread_create(h2,atr,function,0);

pthread_join(*h1,0);
pthread_join(*h2,0);
pthread_attr_destroy(atr);
delete h1;
delete h2;
delete atr;
}

int main(void)
{
int ini,tim;
ini = clock();
withOutThreads();
tim = (int) ( 1000*(clock()-ini)/CLOCKS_PER_SEC );
printf("Time Sequential: %d ms\n",tim);
fflush(stdout);

ini = clock();
withThreads();
tim = (int) ( 1000*(clock()-ini)/CLOCKS_PER_SEC );
printf("Time Concurrent: %d ms\n",tim);
fflush(stdout);
return 0;
}

Linux 上的输出:

Time Sequential: 50 ms
Time Concurrent: 1610 ms

Windows 上的输出:

Time Sequential: 50 ms
Time Concurrent: 30 ms

最佳答案

clock() 在 windows 和 linux 上的工作方式不同,所以不要用它来测量时间。在 linux 上它测量 CPU 时间,在 Windows 上它测量挂钟时间。理想情况下,在这个测试用例中这些是相同的,但是您应该在平台之间使用一致的东西来测量时间。例如gettimeofday()

rand() 在 linux 上序列化你的线程。 rand() 持有一个内部锁以保证线程安全。 rand() 手册页指出 rand() 不是线程安全的,也不是可重入的,但是至少最近 glibc 中的代码在调用周围获得了锁。 我不确定 windows 是如何处理这个问题的,要么它根本不是线程安全的,要么它使用线程局部变量。

在linux上使用rand_r,或者找一些更好的CPU利用率函数来测量。

void* function(void*)
{
unsigned int seed = 42;
int i=0;
for(i=0; i<1110111; i++)
rand_r(&seed);
return 0;
}

关于c++ - Linux 上的 PThreads 和多核 CPU,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5068697/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com