2011-11-27 124 views
0

假设我有一类象下面这样:执行在多线程静态方法

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()方法的实例有其自己的Call Stack。它将一个int arg推入Stack,然后调用Foo.Do()方法。我想知道多线程中的几个实例是否会调用Foo.Do()会干扰其他人吗?每个实例都有Foo.Do()的副本,或者更确切地说呢?

回答

1

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

1

我在woudering多线程中的几个实例是否调用Foo.Do()会干扰对方?每个实例都有Foo.Do()的副本,或者更确切地说呢?

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

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

0

您应该看看API的ThreadLocal API,以便您可以拥有特定于线程的存储。在你的情况下,由于里德建议,它应该没有问题,因为没有共享状态,但如果有任何,这将是重要的静态存储线程之间共享,除非它是ThreadLocal