gpt4 book ai didi

C# 多线程无重复

转载 作者:行者123 更新时间:2023-11-30 21:05:22 25 4
gpt4 key购买 nike

这是我的代码:

    Thread _th1, _th2, _th3, _th4;
int _i;

void thMethod()
{
while(_i < 100){
Thread.Sleep((new Random()).Next(1,500));
Application.DoEvents();
Console.WriteLine(_i);
_i++;
}
}

private void button4_Click(object sender, EventArgs e)
{
_th1 = new Thread(new ThreadStart(thMethod));
_th1.Start();
_th2 = new Thread(new ThreadStart(thMethod));
_th2.Start();
_th3 = new Thread(new ThreadStart(thMethod));
_th3.Start();
_th4 = new Thread(new ThreadStart(thMethod));
_th4.Start();
}

我想做的是,使用多线程从 0 到 99 执行 Console.WriteLine,延迟是随机的。

但是,我的代码打印了重复的数字

嗯,这就是结果。

01个2个2个4个5个6个78个9101012131414161618192020222224242626282830313233343536363839404042424444464648岁495050525254545656585860606262646566666868707072727474767678788080828284848687888890后90后9292949496969898100101102

如您所见,打印了重复的数字,它甚至不会停在 99。

那么...如何更正这段代码以使其正常运行?

======================我必须像这样改变吗..

    void thMethod()
{
while(_i < 100){
Thread.Sleep((new Random()).Next(1,500));
Application.DoEvents();
Interlocked.Increment(ref _i);
Console.WriteLine(_i);
}
}

这个?

最佳答案

虽然您应该使用其他帖子提到的 Interlocked.Increment。这不是您遇到的确切问题。

您的数字超过 100 的原因是因为您增加值的那一行出现在 sleep 之后。这会导致线程进入循环,但当它们写出值时,该值已经变为 100 以上。

例如 t1、t2 和 t3 进入循环并等待 500 毫秒并且 i 为 99。然后 t4 退出并将其递增到 100,现在 t1 将打印 100,t2 将打印 101,t3 将打印 102。

Interlocked.Increment 不会真正解决问题,因为 Thread.Sleep 仍然会在实际写出值时导致不一致。

要解决此问题,您需要使用 thread lock声明一个要锁定的变量,因为您不能锁定 _i,因为它不是引用类型:

object obj = new object();

void thMethod()
{
while (_i < 100)
{
lock (obj)
{
Console.WriteLine(_i);
_i++;
}
Thread.Sleep((new Random()).Next(1, 500));
}
}

这样您就不会得到重复项,并且该值将停止在 99。

关于C# 多线程无重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11730236/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com