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

Question on using multithreading to periodically and forcefully check for updates on software

本文关键字:软件 检查 更新 问题 多线程 于使用      更新时间:2023-10-16

我正在开发一个应用程序,该应用程序有一个主线程执行一些工作(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上是否使用。

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

我特别认为你会发现一个条件变量可以很好地促进简单的交互。

编辑:
只要正确使用互斥锁和条件变量,您几乎可以做任何事情。另一个建议是将线程封装在类对象中。这允许您编写作用于线程及其数据的函数。在您的情况下,主线程可以有一个类似requestupdateconconfirm()的方法,在这个方法中,您可以阻塞调用线程,并等待主线程在释放调用者之前处理请求。