在没有 Parallel.For() 的情况下在 c# 中的 for 循环中实现多线程
Implement Multhithreading in for loop in c# without Parallel.For()
我对 Multithreading.I 比较陌生,已经编写了一个 for 循环,用于打印从 0 到 user.I 指定的 int 数字的值,现在想以每个线程打印的方式并行化它5 numbers.It 在我使用 Parallel.For() 时工作。但我似乎做不到 manually.Here 的代码。
using System;
using System.Threading;
namespace ConsoleApp1
{
class Program
{
static int no = 0;
static void Main(string[] args)
{
Console.WriteLine("Enter a number");
no = int.Parse(Console.ReadLine());
//Parallel.For(0, no, i =>
//Console.WriteLine(i)
//);
//Console.ReadLine();
int start = 0, end = 5, i = 0;
int not = no / 5;
if (no <= 5)
{
func(start, no);
}
else
{
int index = i;
Thread[] t = new Thread[not + 1];
while (index < not + 1)
{
if (end - start >= 5 && end <= no)
t[index] = new Thread(() => func(start, end));
else
t[index] = new Thread(() => func(start, no));
start = end;
end = end + 5;
i++;
t[index].Start();
}
Console.ReadLine();
}
}
static public void func(int start, int end)
{
for (int i = start; i < end; i++)
{
Console.Write(i+",");
}
}
}
}
假设用户输入值为21.Then它产生以下输出
15,16,17,15,16,17,18,19,18,19,25,26,27,28,29,25,26,27,28,29
但是在 t[index].start() 之后使用 thread.join() 之后,会产生以下输出。
5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24
我似乎不明白发生了什么,我无法调试这段代码,因为同时有很多线程 运行。
提前致谢
请注意,像 () => func(start, end)
这样的 lambda 表达式绑定到变量 start 和 end 并且在执行时将使用变量此时恰好具有的值,而不是它们在创建线程时具有的值。
您可以通过首先将当前值分配给循环中定义的变量并在您的 lambda 中使用它们来避免这种情况,例如
if (end - start >= 5 && end <= no)
{
var localStart = start;
var localEnd = end;
t[index] = new Thread(() => func(localStart, localEnd));
}
else
{
var localStart = start;
var localEnd = no;
t[index] = new Thread(() => func(localStart, localEnd));
}
我对 Multithreading.I 比较陌生,已经编写了一个 for 循环,用于打印从 0 到 user.I 指定的 int 数字的值,现在想以每个线程打印的方式并行化它5 numbers.It 在我使用 Parallel.For() 时工作。但我似乎做不到 manually.Here 的代码。
using System;
using System.Threading;
namespace ConsoleApp1
{
class Program
{
static int no = 0;
static void Main(string[] args)
{
Console.WriteLine("Enter a number");
no = int.Parse(Console.ReadLine());
//Parallel.For(0, no, i =>
//Console.WriteLine(i)
//);
//Console.ReadLine();
int start = 0, end = 5, i = 0;
int not = no / 5;
if (no <= 5)
{
func(start, no);
}
else
{
int index = i;
Thread[] t = new Thread[not + 1];
while (index < not + 1)
{
if (end - start >= 5 && end <= no)
t[index] = new Thread(() => func(start, end));
else
t[index] = new Thread(() => func(start, no));
start = end;
end = end + 5;
i++;
t[index].Start();
}
Console.ReadLine();
}
}
static public void func(int start, int end)
{
for (int i = start; i < end; i++)
{
Console.Write(i+",");
}
}
}
}
假设用户输入值为21.Then它产生以下输出
15,16,17,15,16,17,18,19,18,19,25,26,27,28,29,25,26,27,28,29
但是在 t[index].start() 之后使用 thread.join() 之后,会产生以下输出。
5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24
我似乎不明白发生了什么,我无法调试这段代码,因为同时有很多线程 运行。
提前致谢
请注意,像 () => func(start, end)
这样的 lambda 表达式绑定到变量 start 和 end 并且在执行时将使用变量此时恰好具有的值,而不是它们在创建线程时具有的值。
您可以通过首先将当前值分配给循环中定义的变量并在您的 lambda 中使用它们来避免这种情况,例如
if (end - start >= 5 && end <= no)
{
var localStart = start;
var localEnd = end;
t[index] = new Thread(() => func(localStart, localEnd));
}
else
{
var localStart = start;
var localEnd = no;
t[index] = new Thread(() => func(localStart, localEnd));
}