2012-03-08 70 views
0

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

我是新来的多线程,你能告诉我的例子吗?

+4

“A只需要B的小部分数据”听起来不像“A和B在完全不同的数据上运行” – 2012-03-08 00:20:03

+0

为了从B访问数据,您需要中断B一段时间。如果你不想这样做,那就试着让线程独立(或者至少试着让并行性变得粗糙或者尴尬)。 http://en.wikipedia.org/wiki/Parallel_computing#Fine-grained.2C_coarse-grained.2C_and_mbrassing_parallelism – eboix 2012-03-08 00:24:16

+0

理想模式是A不会中断B,就像收听者一样,必要时B将数据传递给A. – will 2012-03-08 16:12:16

回答

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更高效的解决方案。但这样做也很困难,这就是为什么你应该避免它,除非你真的知道你在做什么。

你有几个选项,它可以是所有的混淆。但最好的选择通常是使用lock来访问共享资源,或者使用库中的线程安全结构,这样做并不困难。但是,如果你发现这还不够,你可以选择更先进的替代品,但很难做到正确。