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天后寻求帮助,但我自己没有取得任何有意义的进展。
我想你在这里会感到困惑。你只有一个类和一个对象。线程没有自己的方法副本。当Method_A调用Method_B时,它都在一个线程上。此外:标志的使用非常棘手。你还没有在你的例子中放一个,所以我不能具体说你做错了什么,但我从来没有第一次尝试就把它们做好。(或者第二个。)如果可以的话,最好避开它们。
在这种情况下,我认为您所需要做的就是将对Method_B的调用放入common_object锁块中
就我所能看到的而言,所做的一切在C#中和在Java中都是一样的。
正如terrybozzio所建议的,这是关于将eventwaithalls方法(wait,pulse)放在错误的位置。问题解决了。
谢谢你的小费。