private static void SingleThread(SieveReqGen gen, long smoothsNeeded, SolveRequest o) { long start; long len; SieveInitInfo req; while (true) { if (!gen.NextSegment(out start, out len, out req)) { break; } var currResult = new SieveResult(); Sieve(req, currResult, start, len); lock (o) { if (!o.AddDataToSolveRequestMax(currResult)) { break; } Console.WriteLine("{0} out of {1} smooth numbers found...", o.L, smoothsNeeded); } } }
public static SolveRequest MultiThreadSieve(long smoothsNeeded, int B, SieveReqGen reqGen, int numThreads, int milliswait) { SolveRequest ret = new SolveRequest(B, smoothsNeeded); Thread[] t = new Thread[numThreads]; for (int i = 0; i < numThreads; i++) { t[i] = new Thread(() => SingleThread(reqGen, smoothsNeeded, ret)); t[i].Start(); } bool flag = true; while (flag) { flag = false; for (int i = 0; i < numThreads; i++) { if (t[i].IsAlive) { flag = true; } } Thread.Sleep(milliswait); } return(ret); }