我认为在涉及线程代码时,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
中的循环总是在{{1}之前执行至少那是我的测试所显示的。我跑了几次测试,我总是得到这个。
这是一个错误吗?还是预期的行为?
如果我将上述代码复制到控制台程序并运行,我可以清楚地看到线程效果。
我正在使用TestDriven.net跑步者进行测试。
答案 0 :(得分:2)
无法真正预测两个或多个线程的确切交错。
您的示例需要考虑几个因素。首先,每个线程将在(可能)切换到另一个线程之前执行其量程。您不能指望在代码中的任何特殊位置发生线程切换。即一个线程可能在另一个线程启动之前完成(特别是因为在您的情况下任务相对较短)。
其次,由于您正在写入控制台,因此线程将在该访问上同步。这也会影响交错。
结果还取决于计算机上可用核心的数量(以及运行代码时计算机上的一般负载)。
简而言之,您无法预测两个线程的运行方式。
答案 1 :(得分:1)
m1
或m2
首先开始执行是不确定的。如果计数器执行得足够快,我会不会惊讶地看到其中一个在另一个开始之前完成。将计数更改为非常大的数字(例如一百万),我很确定你会看到同时执行单独的线程。
任何结果都是可能的 - 你看到的结果是什么表明存在错误?