C#线程之间的并发

C#线程之间的并发,c#,concurrency,mutex,nonblocking,thread-synchronization,C#,Concurrency,Mutex,Nonblocking,Thread Synchronization,情况如下: public class MainClass { private static Object common_object; protected int Method_A() { ... lock (common_object) { // Works with common_

情况如下:

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()
           {
             ...

           }

    }
我有一个类:“Main Class”,和2个(或更多)实例

该类有一个对象(private,static),每个实例共享该对象,并在需要时使用“lock(){…}”进行保护。我没有问题

这门课还有两种方法,这两种方法让我疯狂地试图让每件事都顺利进行

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

还有第二种方法B,它的执行时间和代码都要短得多

问题是:

t2调用方法A

t1调用方法A

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

t1和t2被阻断

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

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

我习惯于使用Java,虽然我猜C代码背后有着完全相同的逻辑,但我认为C代码中肯定有一些函数或“技巧”,我不知道

我想(并希望)一定有一个简单的方法来解决这个问题,因为这不是市长的问题,所以我终于来了,在三天后请求帮助,但我自己没有取得任何有意义的进展


提前谢谢。

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

在这种情况下,我认为您所需要做的就是将对方法B的调用放在公共对象锁块中。


据我所知,你在C#和Java中所做的一切都是一样的。

好吧,正如terrybozzio所建议的,这是关于将eventwaithandles方法(wait,pulse)放在错误的位置。问题解决了


谢谢你的提示。

哇。如果您只发布代码,这将更加容易。至少对我来说,你是对的。给我几分钟时间来简化并发布。你有eventwaithandles吗?你的问题很难理解。线程没有方法。一个线程不能“调用”另一个线程的方法。方法属于对象,而不是线程。terrybozzio:不,我不属于,听起来这可能是答案,是的。我会试着用它来解决我的问题。在那之前,我需要研究一段时间。谢谢