// マルチスレッドで素数を求める #include "stdafx.h" #include #include #include static int PrimeTmp[1000], numPrime, nLimit=100; static int start[]={0,11, 7, 13, 19}; static int endFlag[5]; static int displayMode=true; void setPrime(int n, int nTh){ PrimeTmp[numPrime++]=n; if(displayMode){ if((numPrime % 5)==0) printf("\n"); printf("%4d[Mod %d] ", n,nTh); } } void getPrime(void *dt){ int Mod = (int) dt, ist=start[Mod]; for(int n=ist; n<=nLimit;n += 5){ int iflag=true; for(int i=0; i< numPrime; i++) if(n>=PrimeTmp[i]*PrimeTmp[i]){ if((n % PrimeTmp[i])==0){iflag=false;break;} } if(iflag) { setPrime(n, Mod); Sleep(1L);} } endFlag[Mod]=true; } int _tmain(int argc, _TCHAR* argv[]) { // Mod 5 = 1 Mod 5 = 2 Mod 5 = 3 Mod 5= 4 PrimeTmp[0]=2; PrimeTmp[1]=3; PrimeTmp[2]=5; HANDLE hThread[4]; unsigned thrAddr[4]; int Arg[]={2, 1, 3, 4}; while(getch()!=EOF){ for(int i=0;i<5;i++)endFlag[i]=0; numPrime=3; for(int i=0; i<4;i++){ hThread[i]= (HANDLE)_beginthread(getPrime,0,(void *)(Arg[i])); } int flag=false; while(!flag){flag=true;for(int i=1;i<5;i++) flag = flag && endFlag[i];} printf("\n\n** Prime **\n "); for(int i=0;i