假设我有一个类,包含一个简单的方法。假设有一个代表与此方法具有相同的签名。
我想运行多个长时间运行的进程,每个进程都是从这个类启动的。每个进程都包含一个事件,该事件由与上述代理类型相同的多播代理组成。一旦每个“worker”类被实例化,上面提到的“控制”类就使用上面提到的相同的简单方法订阅了worker的事件。一旦每个工人的工作完成,就会调用它的事件。
在单线程环境中,这种架构非常简单。但是,我计划在一个单独的线程上运行每个工作进程。因此,多个工作人员将(几乎)同时调用他们的事件,每个人都通过控制类的简单方法进行订阅。
鉴于委托是不可变的,是否有保证,每个线程都可以独占访问简单方法?我并不担心在简单方法中锁定代码,我担心Thread#1将使用一组参数调用该方法,而Thread#2几乎同时调用相同的方法。
在线程#1进入lock语句之前,线程#2(与线程#2几乎同时进入该方法)会覆盖线程#1指定的参数,从而导致线程#2的参数被有效地处理两次?
我意识到这有点拗口,我很乐意提供更多信息。
答案 0 :(得分:3)
线程不能覆盖方法的参数 - 这些参数存储在堆栈中并始终是线程安全的。在你的情况下,唯一可能不是线程安全的是你的班级状态。
答案 1 :(得分:1)
听起来你是Reactive Framework的完美候选人。 (RX)
我仍然试图绕过它,但这种情况恰好在这个新技术的甜点上。
答案 2 :(得分:0)
感谢您的回复。
@Grzenio:如果线程无法覆盖方法参数,这是否意味着在方法本身中不需要锁定语句,即该方法实际上是线程安全的:
private void DoSomething(object someObject, object someOtherObject) {
lock(someVariable) {
// Does this code need to be locked, or is the method thread-safe?
// Surely 2 threads accessing this method could result in a race condition?
}
}
@Tim:谢谢,我会调查一下。