并行线程中断
本文关键字:中断 线程 并行 | 更新日期: 2023-09-27 18:08:50
我写了一个非静态类
在这个类中,有一个非静态方法调用同一个类的静态方法。在这个静态方法中,在匿名方法(或lambda表达式....)中启动2个或更多不同的线程,它们独立地对一个非常大的数组进行一些工作。
这一切都很完美!!性能很好,没有问题.....
但是…还有一个公共静态属性,由静态锁定对象保护…除了锁定这个静态属性之外,我不会将其用于任何其他目的。
合在一起看起来像这样:
public class testClass
{
private volatile static bool cancelProcessing;
private static readonly object lockObj = new object();
public static bool CancelProcessing
{
get
{
lock (lockObj)
{return cancelProcessing;}
}
set
{
lock (lockObj)
{cancelProcessing = value;}
}
}
public void callingMethod()
{
staticThreadsMethods();
}
private static void staticThreadsMethods()
{
int parts = 4; // array parts
CountdownEvent _countdown = new CountdownEvent(parts);
for (int u = 0; u < parts; u++)
{
Threads[u] = delegate(object counter)
{
// array gets processed
_countdown.Signal();
};
}
_countdown.Wait();
}
}
调用callingMethod()
后,staticThreadsMethods()
内的匿名委托(或lambda表达式)同时启动2个或4个或更多线程…
现在,我真正不能理解的是:
我是否从另一个线程改变属性CancelProcessing
的值,而所有线程并行运行,虽然这个属性不在线程内使用(它应该被用来取消线程,但我总是有相同的错误/异常),我得到一个系统。AccessViolationException,因为指向数组的不安全指针不能被解引用…指针是无效的'不再(?? ?),当我只是改变属性值,但不做任何其他....为什么呢?
如果您使用的是。net 4及以上版本,我建议您使用任务而不是线程来处理计算绑定的数组。使用CancellationTokenSource取消。关于异常它可能与你的数组处理有关而不是bool或锁。您必须揭示更多关于数组处理的信息。