连接两个线程意味着一个线程将在另一个线程完成其任务之后完成;因此,我们使用join()实现原子性。那为什么这还不够?在这种情况下,我们应该使用join()?
发布于 2013-09-21 21:43:58
为什么要加入?当主线程想要启动一堆并行任务线程以加快一些工作时,连接是很有用的。主线程与任务线程“连接”(即等待它们完成任务并终止)。这样,它就可以在任务已经完成的情况下向前迈进。
例如,门户主页可能需要加载一堆显示来自不同来源的数据的小部件。实现这一点的一种方法是让请求处理线程启动并行任务线程来获取数据。这样,用户就不必比最慢的任务线程等待更长的时间(大致如此),而不必等待所有数据依次加载。请求处理线程将与这些线程连接,以确保所有小部件在显示主页之前都有它们所需的数据。
关于数据不一致性的。--如果任务线程都在访问共享数据,则必须有某种方法来确保它们之间不相互覆盖。其他线程正在等待任务线程完成这一事实并不能阻止这种移动。(Mosh = 种族条件)。
发布于 2013-09-21 21:46:47
原子性并不意味着线程应该按照特定的顺序完成。这意味着操作应该以原子方式完成,并且两个线程不应该干扰彼此的任务,这样状态remians是一致的。这是通过使用synchronized
块、AtomicIntegers
等来实现的。
发布于 2013-09-21 22:11:45
多线程对于并行地完成任务非常有用。在大多数情况下,它们都是以相同的数据为依据的。在这种情况下,总是存在数据不一致的危险。一个很好的例子是
Main Thread creates two threads A and B
and waits for them to execute and JOIN
Balance=1000;
Thread A wants to withdraw 300 and Thread B wants to deposit 450
Thread A reads Balance 1000
Context Switch
Thread B reads Balance 1000
Thread B adds 450 to value read.Hence, 1000+450=1450
Write back to Balance;
Balance=1450;
Context Switch
Thread A deducts 300 from value read.Hence, 1000-300=700
Write back to Balance.
Balance=700
Both threads now join the main Thread.
Main thread does further processing.
在这种情况下,即使有一个join
,您也可以看到数据是如何不一致的。有必要相互排斥。
另一方面,Join
用于等待线程,而可能是当主线程只在其他线程完成其任务时才希望进一步工作时。
如果不是这样,您可以分离生成的线程。然后,主线程不需要等待线程完成执行。即使如此,也需要相互排斥。
看这个,加入一个线程意味着什么?
我没有一个通用链接来解释,但我想这个解释非常适用于所有线程(不仅仅是线程)。
pthread_join()函数将挂起调用线程的执行,直到目标线程终止为止,除非目标线程已经终止
https://stackoverflow.com/questions/18940744
复制相似问题