【发布时间】:2016-12-13 21:14:01
【问题描述】:
我有一个带有一些递归函数的应用程序,一般看起来像这样:
threads = 0;
Algorithm(array) {
//some code...
newArray1 = array.Take(array.Length / 2).ToArray();
newArray2 = array.Skip(array.Length / 2).ToArray();
ThreadStart start1 = delegate
{
Algorithm(newArray1);
};
Thread thread1 = new Thread(start1);
ThreadStart start2 = delegate
{
Algorithm(newArray2);
};
Thread thread2 = new Thread(start2);
thread1.Start();
threads++;
thread2.Start();
threads++;
}
不管这个递归有多深,变量threads总是等于2。为什么?
【问题讨论】:
-
因为两个线程共享同一个变量
threads -
@user3185569 所以范围对线程无关紧要?
-
您没有将公共变量设置为Mutual exclusion section。这可能会产生一些不一致的解决方案,因此作为一种良好做法,任何共享变量都应位于互斥部分中。当你等待/加入你的线程来同步它?
-
什么范围?它们都共享相同的变量,并且您在那里有一个竞争条件。这完全取决于您何时检查
threads的值。在启动第二个线程之前尝试Thread.Sleep(5000)并在每个委托中打印threads的值,您很可能会得到1和2作为输出。 -
这里面是什么类型的?我假设
threads是一个周围类型的字段,对吗?如果是的话,你能展示一下这个类型的声明吗?
标签: c# multithreading recursion