簡體   English   中英

pthread_join是一個瓶頸

[英]pthread_join is being a bottleneck

我有一個應用程序,其中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 具有諷刺意味的是,我的串行代碼運行時間為650毫秒 - 670毫秒 我該怎么做才能減少pthread_join所花費的時間?

提前致謝!

在Linux上, clock()測量組合的CPU時間。 它不測量牆壁時間。

這就解釋了為什么你得到~640 ms = 16 * 40ms (正如評論中所指出)

要測量牆壁時間,您應該使用以下內容:

通過創建一些線程,您將為系統增加開銷:創建時間,調度時間。 創建線程需要分配堆棧等; 調度意味着更多上下文切換 此外, pthread_join suspends execution of the calling thread until the target thread terminates 這意味着您希望線程1完成,當他完成時,您可以盡快重新安排,但不能立即重新安排,然后等待線程2等等...

現在你的計算機有幾個內核,比如一個或兩個,你創建了16個線程。 最多程序的2個線程將同時運行,只需添加時鍾測量值就可以得到大約400 ms

這又取決於很多事情,所以我很快就會發生什么事情。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM