并行线程中断

本文关键字:中断 线程 并行 | 更新日期: 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或锁。您必须揭示更多关于数组处理的信息。