pthread_join是一个瓶颈

时间:2012-01-31 22:27:25

标签: c++ multithreading performance pthreads

我有一个应用,其中pthread_join是瓶颈。我需要帮助来解决这个问题。

void *calc_corr(void *t) {
         begin = clock();
         // do work
         end = clock();
         duration = (double) (1000*((double)end - (double)begin)/CLOCKS_PER_SEC);
         cout << "Time is "<<duration<<"\t"<<h<<endl;
         pthread_exit(NULL);
}

int main() {
         start_t = clock();

         for (ii=0; ii<16; ii++) 
            pthread_create(&threads.p[ii], NULL, &calc_corr, (void *)ii);

         for (i=0; i<16; i++) 
            pthread_join(threads.p[15-i], NULL);

         stop_t = clock();

         duration2 = (double) (1000*((double)stop_t - (double)start_t)/CLOCKS_PER_SEC);
         cout << "\n Time is "<<duration2<<"\t"<<endl;

         return 0;
}

在线程函数中打印的时间在 40ms - 60ms 范围内,其中主函数中打印的时间为 650ms - 670ms 。具有讽刺意味的是,我的序列码在 650ms - 670ms 时间运行。我该怎么做才能减少pthread_join所花费的时间?

提前致谢!

2 个答案:

答案 0 :(得分:10)

在Linux上,clock()测量组合的CPU时间。 它不会测量墙上时间。

这解释了为什么你得到~640 ms = 16 * 40ms。 (正如评论中所指出的)

要测量墙壁时间,您应该使用以下内容:

答案 1 :(得分:1)

通过创建一些线程,您将为系统增加开销:创建时间,调度时间。创建线程需要分配堆栈等;调度意味着更多上下文切换另外,pthread_join suspends execution of the calling thread until the target thread terminates。这意味着您希望线程1完成,当他完成时,您可以尽快重新安排,但不能立即重新安排,然后等待线程2等...

现在你的计算机有很少的内核,比如一个或两个,你创建了16个线程。最多程序的2个线程将同时运行,只需添加时钟测量值,您就可以获得400 ms左右的某些内容。

再次取决于很多事情,所以我很快就会发生什么事情。