为什么在并发线程时没有足够的线程来修复数据不一致问题?

时间:2013-09-22 05:39:24

标签: multithreading concurrency

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

3 个答案:

答案 0 :(得分:3)

为什么要加入?当主线程想要启动一堆并行任务线程来加速某些工作时,加入很有用。主线程与任务线程“连接”(即等待它们完成任务并终止)。这样就可以知道任务已经完成了。

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

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

答案 1 :(得分:0)

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

答案 2 :(得分: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用于等待线程,可能是当主线程仅在其他线程完成其工作时才想进一步工作时。

如果不是这种情况,您可以分离生成的线程。然后主线程不需要等待线程完成执行。即便如此,也需要相互排斥。

请阅读此What does it mean to join a thread

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

来自OpenGroup

  

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