假设我有一个类如下:
public static class Foo
{
public static int Do(int original)
{
int result=original + 1;
return result;
}
}
public class Bar
{
public void Invoke()
{
int result=Foo.Do(1);
}
}
任何人都可以告诉我如何在CLR中调用它?我们都知道CLR是基于堆栈的虚拟机。调用Foo.Do()方法的实例有自己的调用堆栈。它将一个int arg推送到Stack,然后调用Foo.Do()方法。我想知道多线程中的少数实例是否会调用Foo.Do()会打扰对方?每个实例都有一个Foo.Do()或者更确切地说是
的副本答案 0 :(得分:1)
我想知道多线程中的少数实例是否会调用Foo.Do()会打扰对方?每个实例都有一个Foo.Do()或者更确切地说是
的副本
在这种情况下,每个实例都没问题。由于Invoke
和Foo.Do
不依赖于任何其他共享状态,因此单独的线程之间没有共享数据。
当您尝试在各个线程之间共享数据时,会出现多线程的主要问题。此时,您需要注意同步对共享数据的访问。
答案 1 :(得分:1)
每个线程都有自己的调用堆栈设置。因此,当您在一个线程中调用函数时,堆栈仅针对该线程更改 。其他线程可以调用他们想要的任何其他函数,而不会相互影响(除了共享状态,但这是另一个问题。重要的是堆栈不是共享的。)
答案 2 :(得分:0)
Perphas您应该查看ThreadLocal API,以便拥有特定于线程的存储空间。在你的情况下,正如Reed建议的那样,它应该没有关系,因为没有共享状态,但是如果有的话,它会很重要,因为静态存储在线程之间共享,除非它是ThreadLocal