Threading не работает должным образом в Nunit? - PullRequest
0 голосов
/ 19 марта 2009

Я думаю, что nunit не работает должным образом, когда задействован многопоточный код:

Вот пример кода:

public class multiply
{
    public Thread myThread;
    public int Counter
    {
        get;
        private set;
    }
    public string name
    {
        get;
        private set;
    }
    private Object thisLock = new Object();
    public void RunConsolePrint()
    {
        //lock(thisLock)
        //{
        Console.WriteLine("Now thread " + name + " has started");
        for (int i = 1; i<= Counter; i++)
        {
            Console.WriteLine(name + ": count has reached " + i+ ": total count is "+Counter);
        }
        Console.WriteLine("Thread " + name + " has finished");
        //}
    }
    public multiply(string pname, int pCounter)
    {
        name = pname;
        Counter = pCounter;
        myThread = new Thread(new ThreadStart(RunConsolePrint));
    }
}

А вот и тестовый код:

[Test]
public  void Main()
{
    counter=100;

    multiply m2=new multiply("Second", counter);
    multiply m1 = new multiply("First", counter);
    m1.myThread.Start();
    m2.myThread.Start();

}

И выводом является последовательный прогон m1 и m2, что означает, что цикл в m1 равен всегда , выполняется первым до m2, по крайней мере, так показали мои тесты , Я провел тесты несколько раз, и я всегда получаю это.

Это ошибка? Или ожидаемое поведение?

Если я скопирую приведенный выше код в консольную программу и запускаю, я ясно вижу эффект многопоточности.

Я использую тест с использованием Runner TestDriven.net.

Ответы [ 2 ]

2 голосов
/ 19 марта 2009

Точное чередование двух или более потоков невозможно предсказать.

Есть несколько факторов, которые следует рассмотреть для вашего примера. Прежде всего, каждый поток будет выполнять свой квант перед (потенциально) переключением на другой поток. Вы не можете ожидать, что переключение потоков произойдет в каком-то особом месте в вашем коде. То есть один поток может закончиться до того, как будет запущен другой (особенно если в вашем случае задача относительно короткая).

Во-вторых, поскольку вы пишете в консоль, потоки синхронизируются при этом доступе. Это также влияет на перемежение.

Результат также зависит от количества доступных ядер на вашей машине (а также от общей нагрузки на машину при запуске кода).

Короче говоря, вы не можете предсказать, как эти два потока будут работать.

1 голос
/ 19 марта 2009

Не определено, начинает ли сначала выполняться m1 или m2. Если счетчик работает достаточно быстро, я бы не удивился, увидев, что один из них закончится раньше, чем начнет другой. Измените счет на что-то очень большое (например, миллион), и я почти уверен, что вы увидите, как отдельные потоки выполняются одновременно.

Возможен любой результат - какой результат, по вашему мнению, свидетельствует об ошибке?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...