关于使用多线程定期强制检查软件更新的问题

Posted

技术标签:

【中文标题】关于使用多线程定期强制检查软件更新的问题【英文标题】:Question on using multithreading to periodically and forcefully check for updates on software 【发布时间】:2011-08-04 00:10:21 【问题描述】:

我正在开发一个应用程序,该应用程序的主线程执行某些工作(UI 的消息循环等),但我还想要第二个线程,它会定期测试是否有任何更新可供下载。我还希望主线程可以要求辅助线程强制检查更新,并且辅助线程可以要求主线程确认下载更新。

我在现实生活中的 IPC 和多线程方面没有太多经验,所以我不确定我应该如何设计它。我希望最终能在 Windows 和 POSIX 上完成这项工作,但现在让我们专注于 POSIX。到目前为止,这是我的想法:

次线程伪代码:

repeat forever:
  check_for_updates()

  if (are_any_updates()) 
    put the list of available updates on some message queue
    send signal SIGUSER1 to main thread
    wait for response from that message queue
    if (response is positive) download_updates()
  
  unblock signal SIGUSER1 on secondary thread
  Sleep(one hour)
  block signal SIGUSER1
  if (any_signal_was_received_while_sleeping)
   any_signal_was_received_while_sleeping := false
   Sleep(one more hour)

辅助线程上的 SIGUSER1 处理程序(主线程已要求我们检查更新):

  block signal SIGUSER1 (making sure we don't get signal in signal)
  any_signal_was_received_while_sleeping := true
  check_for_updates()
  ...
  unblock signal SIGUSER1

基本上,主线程使用 SIGUSER1 要求辅助线程强制检查更新,而辅助线程使用 SIGUSER1 要求主线程查看消息队列以获取可用更新并确认是否应该下载它们.

我不确定这是否是一个好的设计,或者它是否能正常工作。我的一个问题与处理在主线程中收到的 SIGUSER1 有关,因为它是一个非常大的应用程序,我不确定何时是阻止和解除阻止它的正确时间(我认为它应该在消息循环中的某个位置) .

感谢任何意见,包括关于我应该在 Windows 上使用哪些 IPC 功能的建议(可能是 RPC 而不是信号?)。如果我选择线程,我可以完全删除消息队列的使用,但我可能会考虑使用进程。我显然会在 Windows 上使用线程,但我还不确定 POSIX。

【问题讨论】:

我原以为信号量和定时等待就足够了 - 主线程每次想要强制更新检查时都会发布信号量,辅助线程位于循环中,定时执行一小时等待信号量,然后检查更新。当然,主线程也服务于消息队列。不如信号便携,但您不必考虑信号... @SteveJessop:我不知道 POSIX/SysV 信号量有定时等待,我会调查一下,谢谢。即使他们不这样做,我仍然可以使用 pthread 的条件变量的定时等待。 【参考方案1】:

您应该强烈考虑使用boost::thread 来解决您的问题。它比直接使用posix更容易理解,而且是跨平台的。花点时间使用更好的工具,您最终会为自己节省大量精力。

我想您尤其会发现condition variable 会巧妙地促进您的简单交互。

编辑: 通过正确使用互斥锁和条件变量,您几乎可以做任何事情。另一条建议是encapsulate your threads inside class objects。这允许您编写作用于线程及其数据的函数。在你的情况下,主线程可以有一个像 requestUpdateConfirmation() 这样的方法,在这个方法中你可以阻塞调用线程并等待主线程在释放调用者之前处理请求。

【讨论】:

有趣的是,我之前没有使用过Boost.Thread的条件变量和定时等待。这是个好主意,但我仍然有辅助线程想要请求从主线程下载的权限的问题。这里不能使用条件变量,因为主线程卡在做其他工作(UI 消息循环)。但是,我想在不了解主线程如何工作的情况下,您可以提供的建议不多。我不是唯一的开发者,所以我很难自己找到合适的地方来接受信号或其他形式的交流。 假设您的辅助线程可以阻塞等待下载确认,它可以传入问题并在主线程中等待条件。当主线程绕过它(它必须在某个时候)然后它检查一个问题,写一个响应,然后通知辅助线程继续。然后辅助线程获取响应并下载或不下载更新。

以上是关于关于使用多线程定期强制检查软件更新的问题的主要内容,如果未能解决你的问题,请参考以下文章

notes一直闪退怎么办

安卓手机怎样去除软件自动检测更新以及市场检测?

linux 常用软件-不定期更新

如何让xshell软件禁用关闭更新

华为手机软件为啥打不开?

自动 BIN 范围更新/检测服务