从线程中检索数据

时间:2012-03-08 00:18:17

标签: c# multiprocessing

我正在尝试运行两个独立的线程,比如A和B.A和B运行完全不同的数据,而A只需要来自B的一小部分数据。它们都需要一直运行。如何从线程B中检索数据,而不是中断B的运行。

我是多线程新手,你能举例告诉我吗?

1 个答案:

答案 0 :(得分:2)

这不是线程如何工作,线程不“拥有”数据(大多数时候)。您可以像访问任何其他数据一样访问在其他线程上使用或创建的数据,这样做可能非常危险。

问题是大多数数据结构都不能同时从多个线程访问(它们不是thread-safe)。有几种方法可以解决这个问题:

  1. 使用lock(或其他一些同步构造)来访问共享资源。这样做可以确保一次只有一个线程访问资源,因此它是安全的。这是最常用的方法(它每次都有效),它可能是最常见的解决方案,也是最容易正确的解决方案(每次访问资源时,只在右锁定对象上lock)。但它可能会损害性能,因为它可以使线程相互等待很多。
  2. 不要在线程之间共享数据。如果您要并行运行多个操作,则某些操作需要资源A,而其他操作需要资源B,在一个线程上运行需要A的操作,在另一个线程上运行需要B的操作。这样,您可以确保只有一个线程访问A或B,因此它是安全的。另一种变体是每个线程都有资源的副本。
  3. 使用特殊的线程安全数据结构。例如,在.Net 4中,有一个完整的线程安全集合命名空间:System.Collections.Concurrent
  4. 使用不可变数据结构。如果结构没有改变,可以安全地同时从多个线程访问它。例如,因此在几个线程之间共享string是安全的。
  5. 使用避免锁定的特殊构造,例如Interlocked操作或volatile操作。这就是#3中的大多数结构在内部实现的方式,它是一种比#1更高效的解决方案。但是这样做也很难,这就是为什么你应该避免它,除非你真的知道你在做什么。
  6. 你有几个选择,可能会让人感到困惑。但最好的选择通常是使用lock来访问共享资源,或者使用库中的线程安全结构,这样做并不难。但如果你发现这还不够,你可以选择更高级的替代方案,但很难做到正确。