C#线程之间的并发性

本文关键字:并发 之间 线程 | 更新日期: 2023-09-27 18:23:42

场景如下:

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

我有一个类:MainClass,以及它的2个(或更多)实例

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

这门课还有两种方法,它们让我疯狂地试图让一切正常工作。

假设存在";主方法/功能";,A、 它是从外部调用的(我无法控制这些调用,也不知道什么时候会发生,但几乎总是在一个调用和下一个调用之间有很短的间隔)。

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

问题是:

t2调用方法A

t1调用方法A

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

t1和t2被阻断。

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

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

我习惯于使用Java,尽管我想C#代码背后有完全相同的逻辑,但我认为一定有一些函数或";技巧";在c#我失踪了。

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

C#线程之间的并发性

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

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

就我所能看到的而言,所做的一切在C#中和在Java中都是一样的。

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

谢谢你的小费。