0

小介绍:

在复杂的多线程应用程序(企业服务总线 ESB)中,我需要使用 Thread.Abort,因为这个 ESB 接受用户编写的与硬件安全模块通信的模块。因此,如果此模块死锁或硬件停止响应 - 我只需卸载此模块,此服务器应用程序的其余部分必须继续运行。

所以有中止同步机制确保代码只能在用户部分中止,并且该部分必须标记为 AbortAble。如果发生这种情况(中止),则有可能在这段代码中抛出 ThreadAbortException:


public void StopAbortSection()
        {
            var id = Thread.CurrentThread.ManagedThreadId;
            lock (threadIdMap[id])
            {
                ....
            }
        }

例如模块在 AbortSection(通过调用类似方法 StartAbortSection 进入),ServerAplication 决定中止用户模块,但在此决定之后但在实际 Thread.Abort 之前,模块通过调用此方法进入 NonAbortableSection,但实际上对该锁定对象进行了锁定.

所以 lock 将阻塞直到 Abort 被执行,但是 abort 也可以在到达这段代码中的这个块之前被执行。但是使用这种方法的对象是必不可少的,我需要确保这段代码在任何时候都可以安全中止(不会被破坏 - 例如,我不知道从字典中读取时会发生什么......)。

所以不得不提一下threadIdMap是Dictionary(int,ManualResetEvent),而锁定对象是ManualResetEvent的实例。

我希望你现在能理解我的问题。对不起它的大。

4

1 回答 1

1

异常被“违反”是什么意思?

可以在代码中的任何位置抛出 ThreadAbortException。锁根本不会影响这一点,除非它是一个线程正在中止另一个线程,中止线程的代码在锁内,并且线程锁定在同一个对象上。

线程必须锁定同一个对象才能生效。除非您的字典中有不同的项目包含对相同 ManualResetEvent 对象的引用,否则锁是完全没用的。

于 2010-04-15T15:05:22.720 回答