/// <summary> /// this will be the first thread such that its parent = null /// </summary> public void Run_First() { Thread = new System.Threading.Thread(() => { long NextNumber = LastPrime + 1; while (NextNumber >= 0) { PrimeNumberBlock newSet = new PrimeNumberBlock(); newSet.Primes = new List <long>(ProcBlockSize); for (int i = 1; i <= ProcBlockSize; i++) { newSet.Primes.Add(i + NextNumber); } NextNumber += ProcBlockSize; newSet.FirstNonAbsolutePrimeIndex = 0; bool tooFast = true; for (int i = 0; i < FirstMillionPrimes.Length; i++) { for (int j = newSet.FirstNonAbsolutePrimeIndex; j < newSet.Primes.Count; j++) { if (newSet.Primes[j] % FirstMillionPrimes[i] == 0) { newSet.Primes.RemoveAt(j); j--; } else if (FirstMillionPrimes[i] * FirstMillionPrimes[i] >= newSet.Primes[j]) { newSet.FirstNonAbsolutePrimeIndex++; } } if (Child.IsReadyForNextSet) { newSet.NextPrimeIndex = i + 1; Child.Input = newSet; while (Child.IsReadyForNextSet) { System.Threading.Thread.Sleep(1); } tooFast = false; break; } } if (tooFast) { while (!Child.IsReadyForNextSet) { System.Threading.Thread.Sleep(1); } newSet.NextPrimeIndex = newSet.Primes.Count; Child.Input = newSet; while (Child.IsReadyForNextSet) { System.Threading.Thread.Sleep(1); } } } }); Thread.Start(); }
public void Run() { Thread = new System.Threading.Thread(() => { IsReadyForNextSet = true; while (Input == null) { System.Threading.Thread.Sleep(1); } while (true) { PrimeNumberBlock newSet = new PrimeNumberBlock(); for (int i = 0; i < Input.Primes.Count; i++) { newSet.Primes.Add(Input.Primes[i]); } newSet.FirstNonAbsolutePrimeIndex = Input.FirstNonAbsolutePrimeIndex; for (int i = newSet.NextPrimeIndex; i < 1000000; i++) { for (int j = newSet.FirstNonAbsolutePrimeIndex; j < newSet.Primes.Count; j++) { if (newSet.Primes[j] % FirstMillionPrimes[i] == 0) { newSet.Primes.RemoveAt(j); } else if (FirstMillionPrimes[i] * FirstMillionPrimes[i] >= newSet.Primes[j]) { newSet.Primes.Add(Input.Primes[j]); newSet.FirstNonAbsolutePrimeIndex++; } } if (Child.IsReadyForNextSet) { newSet.NextPrimeIndex = i + 1; Child.Input = newSet; Input = null; Child.IsReadyForNextSet = false; IsReadyForNextSet = true; while (Input == null) { System.Threading.Thread.Sleep(1); } break; } } } }); Thread.Start(); }
/// <summary> /// this will be the last thread such that Child = null /// </summary> public void Run_Last() { Thread = new System.Threading.Thread(() => { PrimeNumberBlock newSet = new PrimeNumberBlock(); while (true) { IsReadyForNextSet = true; while (Input == null) { System.Threading.Thread.Sleep(1); } int oldLength = newSet.Primes.Count; for (int i = 0; i < Input.Primes.Count; i++) { newSet.Primes.Add(Input.Primes[i]); } newSet.FirstNonAbsolutePrimeIndex = oldLength + Input.FirstNonAbsolutePrimeIndex; newSet.NextPrimeIndex = Input.NextPrimeIndex; Input = null; IsReadyForNextSet = false; for (int i = newSet.FirstNonAbsolutePrimeIndex; i < newSet.Primes.Count; i++) { for (int j = newSet.NextPrimeIndex; j < FirstMillionPrimes.Length; j++) { if (FirstMillionPrimes[j] * FirstMillionPrimes[j] > newSet.Primes[i]) { break; } if (newSet.Primes[i] % FirstMillionPrimes[j] == 0) { newSet.Primes.RemoveAt(i); i--; break; } } } if (newSet.Primes.Count >= SaveBlockSize) { Save(newSet.Primes.GetRange(0, SaveBlockSize), Next * SaveBlockSize, Next); Next++; newSet.Primes.RemoveRange(0, SaveBlockSize); } } }); Thread.Start(); }