我正在尝试使用C#中的线程生成质数。用户必须输入要生成的线程数。当我运行代码时,我遇到了以下问题:
- 有时,如果我尝试使用多个线程,我会得到“索引超出范围异常”。如果我再试一次,它就可以正常工作。
- 每个线程都在计算相同的值。例如,如果我输入两个线程来生成2到100(包括两端)之间的质数,我会得到以下输出。
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47
我已经阅读了以下帖子。但是我无法解决这些问题。我对线程概念还不熟悉。如何解决这些问题?
Simple prime number program - Weird issue with threads C#
这是我的代码:class Program {
const int min = 2;
const int max = 100;
static List<int> primes = new List<int> ();
static void GeneratePrimes (int start, int range) {
bool isPrime = true;
int end = start + range;
for (int i = start; i <= end; i++) {
for (int j = start; j <= end; j++) {
if (i != j && i % j == 0) {
isPrime = false;
break;
}
}
if (isPrime) {
primes.Add (i);
}
isPrime = true;
}
}
static void Main (string[] args) {
int threadCount = Convert.ToInt32 (Console.ReadLine ());
Thread[] threads = new Thread[threadCount];
int range = (max - min) / threadCount;
int start = min;
for (int i = 0; i < threadCount; i++) {
int startl = start;
threads[i] = new Thread(new ThreadStart(() => GeneratePrimes(start, range)));
startl += range;
threads[i].Start ();
}
for (int i = 0; i < threadCount; i++)
threads[i].Join();
PrintPrimes();
}
static void PrintPrimes () {
foreach (int i in primes)
Console.WriteLine (i);
}
}
更新
我按照NikolayKondratyev的建议进行了更改。但是,当我使用更多的线程(>5)时,列表中出现了重复值。
GeneratePrimes(start, range)
应该改为GeneratePrimes(startl, range)
。 - Nikolay Kstartl += range
(应该改为start += range
吗?) - Rob