gpt4 book ai didi

c# - 如何制作线程竞争情况

转载 作者:行者123 更新时间:2023-11-30 22:10:57 27 4
gpt4 key购买 nike

出于某些原因,我想用 2 个线程创建一个竞争问题。我认为竞争问题是由于 2 个未锁定共享资源的线程同时运行时引起的……这就是我要编写的代码。但是输出是正确的,我希望它是错误的。

我的共享资源是静态类中的静态变量。

问题是它正确输出了 1200。我知道这听起来很奇怪,但我正在尝试了解如何创建/解决此类问题。

在我的书《编程语言的概念》中,从理论上讲了这样一个问题。

问题是:如何让这段代码产生由我的两个线程访问同一共享资源引起的随机问题?

public static class BankAccount
{
public static int solde = 0;

}

public class Program
{
static void Main(string[] args)
{
BankAccount.solde = 1000;

Thread t = new Thread(up);
Thread t2 = new Thread(down);


t.Start();
t2.Start();
t.Join();
t2.Join();


Console.Write(BankAccount.solde);

Console.Read();
}

static void up()
{

for (int i = 0; i < 500; i++)
{
BankAccount.solde++;
}
}

static void down()
{
for (int i = 0; i < 300; i++)
{
BankAccount.solde--;
}
}

}

最佳答案

确实在比赛,只是你跑的次数不够。

试试这个 main 方法。

它会反复尝试并在失败时向您显示,以及需要运行多少次才会失败:

static void Main(string[] args)
{
var runCount = 0;
do
{
BankAccount.solde = 1000;
runCount++;
Thread t = new Thread(up);
Thread t2 = new Thread(down);

t.Start();
t2.Start();
t.Join();
t2.Join();
}
while (BankAccount.solde == 1200);


Console.Write(BankAccount.solde + ": Run: " + runCount);

Console.Read();
}

在调试器中为我输出:

1201: Run: 36

在优化的 Release模式下运行,它很少发生竞争(因为每个线程中的代码运行得非常快,线程 1 通常在线程 2 启动之前完成),但它仍然偶尔会发生:

1414: Run: 168804

如果您希望它更频繁地比赛,请将“向上”循环更改为迭代 50000 次,并将“向下”循环更改为迭代 49800 次。

然后你会得到像这样的疯狂结果( Release模式,外部调试器):

-1198: Run: 12

当减量与增量持续交错时,这种情况最有可能发生,因此在许多情况下,实际上只有减量应用于变量。

关于c# - 如何制作线程竞争情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20509211/

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