为什么联接线程不足以解决具有并发线程时的数据不一致问题?



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

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

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

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

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

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)。

来自开放组

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

原子

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

最新更新