由于某些原因,我想用 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--;
}
}
}
最佳答案
它确实比赛,只是你跑的次数不够。
尝试这个主要方法。
它会反复尝试并向您显示失败的时间,以及失败所需的运行次数:
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/