567
社区成员




int IsPrime(long n)
{
if (n < 2)
return 0;
for (int i=2; i<n; i++)
{
if ((n%i) == 0)
return 0;
}
return 1;
}
DWORD WINAPI PrimeFun(LPVOID param)
{
long num;
volatile long* pNum = (volatile long*)param;
DWORD r = 0;
while ((num = InterlockedIncrement(pNum)) < 500000)
{
r += IsPrime(num);
}
return r;
}
int _tmain(int argc, _TCHAR* argv[])
{
HANDLE hTreads[12] = {0};
for (int i=1; i<13; i++)
{
volatile long num = 0;
for(int j=0; j<i; j++)
{
hTreads[j] = CreateThread(NULL, 0, PrimeFun, (LPVOID)&num, 0, NULL);
}
DWORD t1 = GetTickCount();
WaitForMultipleObjects(i, hTreads, TRUE, -1);
DWORD r = 0;
for (int j=0; j<i; j++)
{
DWORD v = 0;
GetExitCodeThread(hTreads[j], &v);
r += v;
}
printf("%2d个线程, 耗时 %dms, 共有%d个质数\n", i, GetTickCount() - t1, r);
}
return 0;
}