2016-07-28 48 views
1

例如,考虑在用户将新内容输入到文档中时,在大文档上工作的拼写检查程序。为了避免延迟用户的工作,拼写检查在单独的线程上完成,但拼写检查器仍然需要访问文档。我们可以将对文档的所有访问权限放入同步块中,但这会强制编辑线程放慢速度以适应拼写检查线程。在没有同步访问的情况下在线程之间共享大数据

原则上,用户交互线程不应因任何原因被阻塞。如果由于从多个线程访问文档而导致任何延迟,我们希望它们总是在拼写检查线程中发生,但是什么样的线程通信可以保证?

这同样的问题不仅适用于拼写检查。只要一个线程是某些数据的主要拥有者,而另一个线程对数据执行非关键的后台计算,我们就会面临相同的情况。我认为解决方案是某种消息传递系统,其中辅助线程将请求发送给以主线程自己的速度处理的主线程。

+0

你试过用锁吗?如果没有,那么你怎么知道有一个性能问题?我无法想象为什么拼写检查线程需要持续一段时间才能获得最新更新(亚毫秒)的本地副本,或者需要更多时间来通知GUI线程的拼写错误(再次,亚毫秒)。 –

+0

Re,“某种消息传递”,除非LMAX Disruptor适用于您的应用程序(吞吐量非常高,非阻塞,_bounded_队列),否则很可能您的消息传递将使用某种类型的无论如何都锁定。 –

+0

@jameslarge我们希望为性能而设计,而不是一旦解决问题就等待一个问题。原则上UI线程不应该阻塞。我们可能会违反拼写检查的原则,但也可能不会。即使我们可能不需要它,也很好地知道如何正确地做到这一点,因此如果以后要做,它不会造成巨大的改变。 – Geo

回答

2

想和大家分享一些技巧,我会用:

  1. 使用公允ReadWriteLock中。
  2. 使锁定变得细致,使锁定时间不会太长。
  3. 将耗时代码移到锁外。它可能需要复制一些任务上下文。
  4. 在某些情况下使用Copy-On-Write。例如,将您的文档分成多个小部分。假设用户只编辑一个部分。用户正在以正常的人类速度进行编辑。然后,您可以使每个部分成为写入时复制集合。如果你愿意的话,甚至还可以收集牛集合。
相关问题