如何进行穿线比赛的情况

时间:2013-12-11 02:05:09

标签: c# multithreading

由于某些原因,我想用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--;
        }
    }

}

2 个答案:

答案 0 :(得分:3)

比赛,你只是没有运行足够的时间。

请尝试使用此主要方法。

它反复尝试并在失败时向您显示,以及失败所需的运行次数:

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

在优化的发布模式下运行,它很少比赛(因为每个线程中的代码运行得如此之快,线程1通常在线程2开始之前完成),但它偶尔会发生:

1414: Run: 168804

如果你希望它更频繁地竞赛,请将'up'循环更改为50000次,并将'down'循环重复49800次。

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

-1198: Run: 12

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

答案 1 :(得分:0)

做更多更复杂的事情;你的关键部分非常小,这减少了交错的可能性,你输入它们的次数越多,你就越有可能遇到“问题”。