繁体   English   中英

在C#中进行线程化,值类型和引用类型澄清?

[英]Threading in C# , value types and reference types clarification?

在阅读了Jon Skeet 文章和msdn的这篇文章后,我仍然有一个问题

假设我有这段代码:

  MyPerson mp = new MyPerson(); //Field

  int g=0; //Field

  public void DoWork ()
   {
      int i;
      MyPerson mp2 = new MyPerson();  
      ...
   }

现在让我们说我有两个主题。 运行DoWork (现在让我们忽略,竞争条件)

  • 他们是否会看到相同的g或每个线程都有自己的项目? (价值)

  • 他们都会看到相同的mp或每个线程都有自己的项目? (实例)

  • 他们是否会看到相同的i或每个线程都有自己的项目? (价值)

  • 他们是否会看到相同的mp2或每个线程都有自己的项目? (实例)

  • 如果他们都看到相同,为什么我需要static

我搜索了很多关于这个主题的内容, 找不到任何文章说明:不同的主题,参考类型和价值类型...)

这两个线程都不是“运行DoWork ”; 他们在特定对象上运行DoWork 如果针对不同的实例创建了两个线程,则mpg将是完全独立的字段。 如果创建了针对同一实例的两个线程,则将共享mpg 不保证线程将看到另一个线程所做的更改,除非您使用同步或volatile访问。

例如:

var obj = new SomeObject();
Thread thread1 = new Thread(obj.DoWork);
Thread thread2 = new Thread(obj.DoWork); // clearly targeting the same instance

VS

var obj = new SomeObject();
Thread thread1 = new Thread(obj.DoWork);
obj = new SomeObject();
Thread thread2 = new Thread(obj.DoWork); // targeting a different instance

局部变量imp2严格地特定于每个线程。

附加说明:即使它们是独立的域/本地人,如果有的在代码的...后来重新分配mpmp2同一个对象 ,那么他们将被争吵不休相同的对象; 相同的同步/ volatile规则将适用。

变量gmp对于包含类是“全局的”,因此它们将是两个线程看到的相同对象。 i是在DoWork事件中声明的局部变量; 随后这只会对后台/替代线程“可见”。

他们没有“看到”相同,所以在这种情况下static关键字没有相关性。

我希望这有帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM