簡體   English   中英

使用多線程時計算執行時間

[英]Calculating execution time while using multi-threading

多線程是否能更有效地計算大量隨機生成值的平均值?

對於使用三個並行線程來計算大量隨機生成值的平均值的代碼。 我嘗試兩次計算執行時間。 一次使用多線程,另一次僅使用一個線程,但是我不明白為什么多線程需要更長的執行時間。

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
#include <time.h>

long int count=0,sum=0;
HANDLE ht1,ht2,ht3,Semaphore1,Semaphore2;

LARGE_INTEGER Start_time,End_time,Elapsed_time;
LARGE_INTEGER Frequency;


DWORD WINAPI Counter(LPVOID param)
{
long int i=0;

QueryPerformanceFrequency(&Frequency);
QueryPerformanceCounter(&Start_time);

    while (count<1000000)
    {
     WaitForSingleObject(Semaphore2,INFINITE);
     if(count<1000000)
     {
     count++;
     sum=sum+rand()%100;
     i++;
     }
    ReleaseSemaphore(Semaphore2,1,0);
    }
QueryPerformanceCounter(&End_time);
Elapsed_time.QuadPart = End_time.QuadPart - Start_time.QuadPart;
Elapsed_time.QuadPart =  (Elapsed_time.QuadPart * (1000))/ Frequency.QuadPart;

printf("Thread %d generated %d numbers\n",GetCurrentThreadId(),i);

ReleaseSemaphore(Semaphore1,1,0);
}


int main() {

    DWORD ThreadID1,ThreadID2,ThreadID3;
    char c;

    srand (time(NULL));

    ht1 = CreateThread(NULL,0,Counter,NULL,CREATE_SUSPENDED,&ThreadID1);
    ht2 = CreateThread(NULL,0,Counter,NULL,CREATE_SUSPENDED,&ThreadID2);
    ht3 = CreateThread(NULL,0,Counter,NULL,CREATE_SUSPENDED,&ThreadID3);

    Semaphore1=CreateSemaphore(NULL,0,1,NULL);
    Semaphore2=CreateSemaphore(NULL,1,1,NULL);

    printf("Thread 1 id is %d \n",ThreadID1);
    printf("Thread 2 id is %d \n",ThreadID2);
    printf("Thread 3 id is %d \n",ThreadID3);

    ResumeThread(ht1);
    ResumeThread(ht2);
    ResumeThread(ht3);

    WaitForSingleObject(Semaphore1,INFINITE);

    printf("Count reached %d \n",count);
    printf("Sum reached %d \n",sum);
    printf("Average is %f \n",(float)sum/(float)count);
    printf("Time in ms %d \n",Elapsed_time.QuadPart);

    while(c != 'e') {c = getche();}
    return 0;
}

我預計使用多線程的時間將少於使用一個線程的時間。 使用多線程輸出為2899毫秒,僅使用一個線程輸出為947毫秒

為了提高多線程性能,每個線程需要在共享的關鍵部分之外進行一些計算。 在此代碼中,所有計算都是由多個線程競爭一個共享的關鍵部分上的鎖來完成的。 實際上,該代碼在邏輯上是單線程的,因為一次最多只能有一個線程持有對該關鍵部分的鎖定。 但是,添加更多線程會增加爭用並在鎖定上安排等待時間,從而減慢單線程程序在不鎖定的情況下執行的計算速度。

要么找到一種在線程之間分配任務的方式,以便它們在最后合並結果,要么使用一個線程。

暫無
暫無

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

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