gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 12:17:34 25 4
gpt4 key购买 nike

我正在开发一个应用程序,它有一个主线程执行一些工作(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 更容易理解,并且是跨平台的。花时间使用更好的工具,您最终会省去很多精力。

特别是我想你会发现 condition variable会巧妙地促进您的简单交互。

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

关于c++ - 关于使用多线程定期强制检查软件更新的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6934781/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com