0

场景如下:

public class MainClass

    {

           private static Object common_object;

           protected int Method_A()
           {

             ...

             lock (common_object)
                 {

                     // Works with common_object;

                     ...

                 }

             ...

             // Invokes another's thread Method_B

           }

           protected int Method_B()
           {
             ...

           }

    }

我有一个类:“主类”,以及它的 2 个(或更多)实例。

该类有一个对象(私有、静态),每个实例都共享该对象,并在需要时使用“lock(){...}”进行保护。我对此没有任何问题。

该类也有 2 种方法,它们让我疯狂地试图让一切正常工作。

假设有一个“主要方法/函数”,A,它是从外部调用的(我无法控制这个调用,也不知道什么时候会发生,但几乎所有时间都在一个之间有很短的空间调用和下一个)在两个线程上。

还有第二种方法,B,更短(在执行时间和代码中)。

这是问题所在:

t2 调用方法 A

t1 调用方法 A

t2(来自方法 A)调用 t1 的方法 B

t1 和 t2 被阻塞。

一个线程(t2)的方法 B 是从另一个线程(t1)的方法 A 调用的,如果在 t2 正在执行方法 A 时调用了它,那么一切都会以某种方式崩溃。通常两个线程都被阻塞。

我正在使用一个标志变量,所以当 t2 开始执行方法 A 时,t1 使用这个标志来知道在 t2 完成方法 A 执行之前他不能调用 t2 的方法 B,但似乎我错过了一些东西因为它不起作用。

我习惯于使用 Java,但我想 C# 代码中存在完全相同的逻辑,我认为 C# 中一定有一些我缺少的函数或“技巧”。

我想(并希望)必须有一种简单的方法来解决这个问题,因为它不是市长的问题,所以我终于来了,3 天后寻求帮助,但我自己没有任何重大进展。

提前致谢。

4

2 回答 2

0

我想你在这里感到困惑。你只有一个类和一个对象。线程没有自己的方法副本。当 Method_A 调用 Method_B 时,它都在一个线程上。另外:标志使用起来非常棘手。你没有在你的例子中放一个,所以我不能具体说明你做错了什么,但从来没有在第一次尝试时就正确。(或第二个。)如果可以,最好避免它们。

在这种情况下,我认为您需要做的就是将对 Method_B 的调用放在 common_object 锁定块中。

据我所知所做的一切在 C# 中和在 Java 中的工作方式相同。

于 2013-07-18T16:23:34.840 回答
0

好吧,正如 terrybozzio 所建议的那样,这是关于将 eventwaithandles 方法(等待、脉冲)放在错误的位置。问题解决了。

谢谢你的提示。

于 2013-07-22T01:37:44.150 回答