以下是一个使用C语言和Windows平台的多线程编程示例,它可以计算每个线程的真正执行耗时,精确到微秒。
#include <windows.h>
#include <stdio.h>
#define NUM_THREADS 4
#define LOOP_COUNT 100000
DWORD WINAPI ThreadFunc(LPVOID lpParam);
int main()
{
HANDLE hThread[NUM_THREADS];
DWORD dwThreadId[NUM_THREADS];
int i;
for (i = 0; i < NUM_THREADS; i++)
{
hThread[i] = CreateThread(NULL, 0, ThreadFunc, (LPVOID)i, 0, &dwThreadId[i]);
if (hThread[i] == NULL)
{
printf("CreateThread failed (%d)\n", GetLastError());
return 1;
}
}
WaitForMultipleObjects(NUM_THREADS, hThread, TRUE, INFINITE);
for (i = 0; i < NUM_THREADS; i++)
{
DWORD exitCode;
GetExitCodeThread(hThread[i], &exitCode);
printf("Thread %d executed for %d microseconds.\n", i, exitCode);
CloseHandle(hThread[i]);
}
return 0;
}
DWORD WINAPI ThreadFunc(LPVOID lpParam)
{
int threadNum = (int)lpParam;
LARGE_INTEGER frequency;
LARGE_INTEGER startCount;
LARGE_INTEGER endCount;
QueryPerformanceFrequency(&frequency);
QueryPerformanceCounter(&startCount);
int i;
for (i = 0; i < LOOP_COUNT; i++)
{
// Do some work here.
}
QueryPerformanceCounter(&endCount);
return (DWORD)((endCount.QuadPart - startCount.QuadPart) * 1000000.0 / frequency.QuadPart);
}
在这个示例中,我们创建了4个线程并分别启动它们。每个线程执行一个简单的循环,模拟一些计算密集型工作。为了测量每个线程的真正执行耗时,我们使用了Windows提供的高精度计时器——QueryPerformanceCounter
和QueryPerformanceFrequency
。在每个线程结束时,它会返回一个数值,表示它实际执行的时间,单位是微秒。
注意,在主线程中,我们使用了WaitForMultipleObjects
函数等待所有线程结束。这是因为我们需要确保每个线程都完成了它的工作,才能获取正确的执行时间。
此外,我们还使用了GetExitCodeThread
函数获取线程的退出码,它也就是该线程实际执行的时间(微秒)。
最后,我们将每个线程的执行时间打印出来,并关闭线程句柄,释放资源。