关于使用多线程定期和强制检查软件更新的问题
Question on using multithreading to periodically and forcefully check for updates on software
我正在开发一个应用程序,该应用程序有一个主线程执行一些工作(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()的方法,在这个方法中,您可以阻塞调用线程,并等待主线程在释放调用者之前处理请求。
- valgrind-hellgrind与泄漏检查的结果不同
- C++模板来检查友元函数的存在
- 检查输入是否不是整数或数字
- 试图让变量检查数组中的某些内容
- 检查值是否在集合p1和p2中,但不在p3中
- C++概念:如何使用'concept'检查模板化结构的属性?
- 概念TS检查忽略私有访问修饰符
- 检查 std::shared_ptr<> 的当前底层类型是否为 T
- 在c++中检查长方体是否尽可能快地重叠(无迭代)
- 如何在C++中检查2D数组中负值的输入验证
- C++:正在检查LinkedList中的回文-递归方法-错误
- 使用for循环检查数组中的重复项
- 如何检查一个c++字符串中有多少相同的字符/数字
- 检查不带转换的扫描格式
- 如何检查线程是否锁定
- C++ Windows - 以编程方式检查软件是否访问互联网?
- 可以检查空取消引用的调试软件
- 使用 C/C++ 检查 Windows 中的软件安装和安装目录
- wxwidgets中是否有检查pdf软件可用的功能
- 关于使用多线程定期和强制检查软件更新的问题