首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >并行线程中断

并行线程中断
EN

Stack Overflow用户
提问于 2013-04-13 06:34:42
回答 1查看 125关注 0票数 0

我已经写了一个非静态类。

在这个类中,有一个非静态方法调用同一个类的静态方法。在这个静态方法中,在匿名方法(或lambda表达式...)中启动了2个或更多不同的线程。它们独立地在一个非常大的数组上做一些工作。

这一切都工作得很完美!很棒的表现,没有问题……

But....there也是一个公共静态属性,它受到静态锁定object...that的保护,我不会将其用于锁定此静态属性以外的任何其他用途。

在某种程度上,所有这些看起来就像这样:

代码语言:javascript
复制
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()中同时启动2个或4个或更多的线程作为匿名委托(或λ表达式)...

现在,我真的不能理解的是:

当所有线程都在并行运行时,我是否从另一个线程更改了a属性CancelProcessing的值,尽管此属性未在线程内使用(它本应用于取消线程,但我始终具有相同的错误/异常),我得到了System.AccessViolationException,因为指向数组的不安全指针“不能是dereferenced...The指针无效”(??)当我只更改属性值,而不做其他任何事情时...为什么会这样呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-13 07:05:00

如果您使用的是.NET 4或更高版本,我建议您使用任务而不是线程来处理计算绑定数组。使用CancellationTokenSource进行取消。关于异常,它可能与您的数组处理有关,而不是与布尔或锁定有关。您必须揭示更多有关数组处理的信息。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15981920

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档