在多线程中执行静态方法

时间:2011-11-27 02:11:34

标签: c#

假设我有一个类如下:

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()或者更确切地说是

的副本

3 个答案:

答案 0 :(得分:1)

  

我想知道多线程中的少数实例是否会调用Foo.Do()会打扰对方?每个实例都有一个Foo.Do()或者更确切地说是

的副本

在这种情况下,每个实例都没问题。由于InvokeFoo.Do不依赖于任何其他共享状态,因此单独的线程之间没有共享数据。

当您尝试在各个线程之间共享数据时,会出现多线程的主要问题。此时,您需要注意同步对共享数据的访问。

答案 1 :(得分:1)

每个线程都有自己的调用堆栈设置。因此,当您在一个线程中调用函数时,堆栈仅针对该线程更改 。其他线程可以调用他们想要的任何其他函数,而不会相互影响(除了共享状态,但这是另一个问题。重要的是堆栈不是共享的。)

答案 2 :(得分:0)

Perphas您应该查看ThreadLocal API,以便拥有特定于线程的存储空间。在你的情况下,正如Reed建议的那样,它应该没有关系,因为没有共享状态,但是如果有的话,它会很重要,因为静态存储在线程之间共享,除非它是ThreadLocal