C#线程之间的竞争

时间:2013-07-16 22:25:35

标签: c# concurrency mutex nonblocking thread-synchronization

场景如下:

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个(或更多)实例。

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

班级还有两种方法,这些方法让我变得疯狂,试图让一切运转起来。

假设有一个“主要方法/功能”,A,它是从外部调用的(我无法控制这个调用,也不知道何时会发生,但几乎所有的时间都非常短暂两个线程上一个invokation和下一个invokation之间的空格。

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

问题在于:

t2调用方法A

t1调用方法A

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

t1和t2被阻止。

从另一个线程(t1)的方法A调用一个线程(t2)的方法B,如果在t2执行方法A时完成,则一切都以这种或那种方式崩溃。通常两个线程都被阻止。

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

我习惯使用Java,而且我觉得C#代码存在完全相同的逻辑,我认为c#中必须有一些函数或“技巧”我缺少。

我想(并且希望)必须有一个简单的方法来解决这个问题,因为它不是市长,所以我终于来了,在3天之后寻求帮助而我自己没有任何有意义的进展。< / p>

提前致谢。

2 个答案:

答案 0 :(得分:0)

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

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

就我而言,所做的一切在C#中都与在Java中一样。

答案 1 :(得分:0)

好吧,正如terrybozzio所说,它是关于将eventwaithandles方法(等待,脉冲)放在错误的地方。问题解决了。

感谢您的提示。