0

加入两个线程意味着一个线程将在另一个线程完成其任务后完成;因此,我们通过 join() 实现了原子性。那么,为什么还不够呢?在什么情况下我们应该使用join()?

4

3 回答 3

3

为什么要加入?当主线程想要启动一堆并行任务线程以加快某些工作时,加入很有用。主线程“加入”任务线程(即等待它们完成任务并终止)。这样它就可以在知道任务已经完成的情况下继续前进。

例如,门户主页可能需要加载一堆显示来自各种来源的数据的小部件。实现这一点的一种方法是让请求处理线程启动并行任务线程来获取数据。这样,用户不必等待比最慢的任务线程更长的时间,而不是等待所有数据串行加载。请求处理线程将加入这些线程,以确保所有小部件在显示主页之前都拥有所需的数据。

关于数据不一致。如果任务线程都在访问共享数据,则必须有某种方法来确保它们不会相互干扰。其他一些线程正在等待任务线程完成的事实并不能阻止这种混乱。(Mosh =比赛条件)。

于 2013-09-22T05:43:58.207 回答
0

原子性并不意味着线程应该以特定的顺序完成。这意味着操作应该以原子方式完成,并且 2 个线程不应干扰彼此的任务,以使状态保持一致。这是通过使用synchronizedAtomicIntegers等来实现的。

于 2013-09-22T05:46:47.420 回答
0

多线程对于并行完成任务很有用。在大多数情况下,它们作用于相同的数据。在这种情况下,总是存在数据不一致的危险。一个很好的例子是,

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另一方面,用于等待线程,可能是当主线程仅在其他线程完成工作时才想做进一步的工作。

如果不是这种情况,您可以分离生成的线程。那么主线程就不需要等待线程完成执行了。即便如此,互斥的需求也出现了。

阅读本文,加入一个线程是什么意思

我没有解释的通用链接,但我想这个解释非常适用于所有线程(不仅仅是 pthreads)。

来自OpenGroup

pthread_join() 函数将暂停调用线程的执行,直到目标线程终止,除非目标线程已经终止

于 2013-09-22T06:11:45.263 回答