標籤:
#include <windows.h>#include <stdio.h>#include <process.h>int g_ntotal = 100;int g_thread_counter;int g_sum;//計算結果HANDLE g_thread_lock;//HANDLE 被類型定義為 void *struct THREAD_DATA{ int num_threads; int thread_id;};void sum_func(void *pdata){ THREAD_DATA *ptdata = (THREAD_DATA *)pdata; int i, sum = 0; for (i = ptdata->thread_id; i <= g_ntotal; i += ptdata->num_threads) sum += i; delete ptdata; WaitForSingleObject(g_thread_lock, INFINITE); g_sum += sum; --g_thread_counter; ReleaseMutex(g_thread_lock);}void main(void){ LARGE_INTEGER hfreq, hcounter1, hcounter2;//這三個貨是64位的整數 QueryPerformanceFrequency(&hfreq); //printf("%ld",hfreq); SYSTEM_INFO sys_info;//這貨是結構體變數 GetSystemInfo(&sys_info);//實參為指向結構體的指標 int num_processors = sys_info.dwNumberOfProcessors;//值為2,是一個DWORD類型的成員變數,DWORD被定義為無符號長整型 //num_processors = 1; printf("Number of processors=%d\n", num_processors);//機器支援的線程數目 g_thread_lock = CreateMutex(NULL, FALSE, NULL);//傳回值為無類型指標,CreateMutex作用是找出當前系統是否已經存在指定進程的執行個體。如果沒有則建立一個互斥體。 g_thread_counter = num_processors;//系統支援的線程數 g_sum = 0;//計算結果初始化 QueryPerformanceCounter(&hcounter1);//擷取目前時間儲存到 hcounter1 中,實參是指向64位整數的指標 int i; THREAD_DATA *pdata;//THREAD_DATA是本程式中自己定義的結構體 for (i = 1; i < num_processors; ++i) { pdata = new THREAD_DATA; pdata->thread_id = i + 1; pdata->num_threads = num_processors;//值為2 _beginthread(sum_func, 0, pdata); } pdata = new THREAD_DATA; pdata->thread_id = 1; pdata->num_threads = num_processors;//值為2 sum_func(pdata); while (1) { int itemp; WaitForSingleObject(g_thread_lock, INFINITE); itemp = g_thread_counter;//系統支援的線程數,值為2 ReleaseMutex(g_thread_lock); if (itemp == 0) break; } QueryPerformanceCounter(&hcounter2);//擷取結束時間,儲存到 hcounter2 中 double dt = (double)(hcounter2.QuadPart - hcounter1.QuadPart) / (double)hfreq.QuadPart;//運算式中涉及的三個變數是共用體類型(8位元組),其中QuadPart是共用體的 long long類型成員,在此處被毫無節操地轉換成了double類型,double也是佔用8位元組 printf("sum=%d\n", g_sum); printf("Calculation time=%f\n", dt);//此處將%g改為了%f,這裡是代碼的已耗用時間 //printf("%d", sizeof(double)); getchar(); CloseHandle(g_thread_lock); //將CreateMutex建立的互斥體關閉}
c++多線程執行個體