2011-12-22 74 views
0

这是一个非常概念性的问题。做2线程交互互相减慢?

比方说,我有2个独立的线程。线程A不断获取时间并将其存储为变量,线程B不断从线程B的变量中获取时间并对其进行处理。

当线程B访问线程A中的变量时,线程A是否停止运行直到操作完成?

要展开,如果您有3个线程,线程A获取当前时间并将其设置为线程B中的变量,然后线程C读取该变量,会发生什么情况。

如果线程A正在分配变量的中间,线程C开始读取它,那么线程是否停止运行直到A完成?

感谢您的伟大答案,但现在我还有1个问题。如果他们会干涉,那么在通信时多线程不会竞争的首选解决方案是什么? (概念上)你会怎样做才能让这些线程分享变量的价值,同时保持尽可能快的速度?

+0

你是什么意思“线程A中的变量”?你的意思是一个线程局部变量? –

回答

4

记忆和thrads是两个完全不同的东西。即使是表示线程的类的一部分的变量,也是任何线程都可以访问的内存。

但是,这会导致处理器缓存变得复杂化:处理器缓存:为了使在不同CPU上运行的两个线程访问同一块内存并“看到”彼此的变化,CPU缓存必须是同步的,如果它发生很多,这可以完全否定这些高速缓存的(大规模)速度优势。

请注意,由于高速缓存的原因,线程B实际上可能会在任意长的时间内看到该变量的过时值,除非这两者都访问同步块内的变量,或者该变量是使用关键字volatile声明的。

0

这取决于操作系统和CPU的数量,但基本上是的,当一个线程工作时,另一个等待。如果线程B使用线程A使用的变量,那么它并不重要,因为它们共享相同的内存。

3

通常不会,除非您声明getter和setter同步。如果setter从一个线程被调用,另一个线程想要访问getter,它必须等待另一个线程先结束他的任务。

我希望我能理解这个问题。

0

是的,他们放慢了速度。

这是因为你的并发性检查你在应用程序中编码:因为你有一个锁,信号量,监视器,或者其他什么,调节对存储变量的访问,每个线程可能会等待获得独占访问读/编写变量。

即使您没有并发检查,我也很确定内存不允许同时读取或读取/写入:因为这种情况可能发生,您的线程将被迫减慢一点点但是

1

它不会使线程B慢线程A下来。

但是:
1.线程A可能会减慢线程B.根据系统架构(核心和高速缓存),线程A的每次写入都会清除线程B的CPU的高速缓存线。 B的下一次阅读会更加昂贵。
2.如果使用锁来保护数据结构,则两个线程都必须获取它。那么,显然,线程A会放慢速度。
3.如果您没有使用锁定,并且您的数据类型不是原子的,则可能会读取损坏的数据。例如,如果时间从0x0000ffff更改为0x00010000,则可能会读取0x0001ffff。通常情况下,一个4字节对齐的整数是原子的,所以如果你的时间是time_t,你可能就没问题了。但细节依赖于平台。