0
我试图运行两个单独的线程,如A和B. A和B运行在完全不同的数据上,A只需要B的一小部分数据。它们都需要全部运行。如何从线程B中检索数据,而不是中断B的运行。从线程检索数据
我是新来的多线程,你能告诉我的例子吗?
我试图运行两个单独的线程,如A和B. A和B运行在完全不同的数据上,A只需要B的一小部分数据。它们都需要全部运行。如何从线程B中检索数据,而不是中断B的运行。从线程检索数据
我是新来的多线程,你能告诉我的例子吗?
这不是线程的工作方式,线程不会“拥有”数据(大部分时间)。您可以像访问其他数据一样访问在另一个线程上使用或创建的数据,但这样做可能会非常危险但。
问题是大多数数据结构不能同时从多个线程访问(它们不是thread-safe)。有几种方法可以解决这个问题:
lock
(或其他一些同步构造)来访问共享资源。这样做可以确保一次只有一个线程访问资源,所以它很安全。这是最常用的方法(它每次都有效),它可能是最常见的解决方案,也是最容易找到的解决方案(每次访问资源时右锁对象只有lock
)。但它可能会损害性能,因为它可以使线程相互等待很多。System.Collections.Concurrent
。string
是安全的。Interlocked
操作或volatile
操作。这是来自#3的大多数结构是如何在内部实现的,并且这是一种比#1更高效的解决方案。但这样做也很困难,这就是为什么你应该避免它,除非你真的知道你在做什么。你有几个选项,它可以是所有的混淆。但最好的选择通常是使用lock
来访问共享资源,或者使用库中的线程安全结构,这样做并不困难。但是,如果你发现这还不够,你可以选择更先进的替代品,但很难做到正确。
“A只需要B的小部分数据”听起来不像“A和B在完全不同的数据上运行” – 2012-03-08 00:20:03
为了从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
理想模式是A不会中断B,就像收听者一样,必要时B将数据传递给A. – will 2012-03-08 16:12:16