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:不,我不属于,听起来这可能是答案,是的。我会试着用它来解决我的问题。在那之前,我需要研究一段时间。谢谢