我正在玩多线程(没有先前的经验),并且有一个简单的函数从 int main 通过两个单独的线程调用,这些线程只是从 2 个 for 循环中更改(并创建)一个变量。据我所知,两个线程之间没有依赖关系,但是一个线程运行我的时间是 2.29 秒,两个时间是 7.11 秒(我本来预计会是 3-4 秒)。
我在具有两个 Intel atom CPU(Ubuntu 10.04)的上网本上运行 - 我知道这两个线程都不会获得单个 CPU 的完全“所有权”,因为 int main() 进程本身涉及一个线程(以及任何操作系统需要)但我对性能下降感到震惊(大概是线程切换!?)
有什么办法可以在这里改进吗?(可能会减少 CPU 在线程之间跳转所需的工作)。我希望很快能做一些更丰富的事情(使用轮分解进行初筛,其中不同的线程拥有不同的辐条),但我对我现在得到的性能印象并不深刻
我现在的简单代码如下:
#include <iostream>"
#include <ctime>
#include <pthread.h>
void* foo(void* dummyVar)
{
for(int i=1; i < 10; i++)
{
for(int j=1; j < 50000000; j++)
{
int test = j;
}
std::cout << i << "\n";
}
pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{
clock_t start = clock();
pthread_t thread1;
pthread_t thread2;
pthread_attr_t attribute;
void* status;
pthread_attr_init(&attribute);
pthread_attr_setdetachstate(&attribute, PTHREAD_CREATE_JOINABLE);
int i = 0;
int b = pthread_create(&thread1, NULL, foo, (void*)i);
int c = pthread_create(&thread2, NULL, foo, (void*)i);
pthread_join(thread1, &status);
pthread_join(thread2, &status);
std::cout << ((double)clock() - start) / CLOCKS_PER_SEC << "\n";
return 0;
}
更新:我通过让与 main() 关联的线程在另一个线程也调用 foo 之后(而不是两个线程)调用 foo 来获得更好的性能(显然!),尽管这台机器上的多线程仍然较慢(已经对foo - 现在只有一个 for 循环 - 时间是 5.17 vs 6.01)