我正在研究一个主线程执行一些工作(UI的消息循环等)的应用程序,但我也想要第二个线程,它会定期testing是否有任何更新可供下载。 我还希望主线程可能要求辅助线程强制检查更新,并且辅助线程要求主线程确认下载更新。
在现实生活中,我没有那么多IPC和multithreading的经验,所以我不知道应该怎样去devise这个。 我想最终在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请求主线程查看消息队列中的可用更新并确认是否应该下载它们。
我不确定这是否是一个好的devise,或者它是否能正常工作。 我的一个问题与处理主线程中接收到的SIGUSER1有关,因为它是一个相当大的应用程序,我不确定什么时候是合适的时间来阻止和解除阻塞(我认为它应该在消息循环中的某个地方) 。
任何意见,包括build议什么IPCfunction,我应该在Windows上使用(也许RPC而不是信号?)。 我可以完全删除消息队列的使用,如果我解决了线程,但我可能会考虑使用进程。 我会清楚地使用Windows上的线程,但我不确定POSIX。
你应该强烈考虑使用boost :: thread来解决你的问题。 它比直接使用posix更容易理解,并且是跨平台的。 花点时间来使用更好的工具,最终可以节省大量的人力。
特别是我认为你会发现一个条件变量将整齐地促进你简单的交互。
编辑:
你可以通过正确使用互斥锁和条件变量来做任何事情。 另一条建议是将你的线程封装在类对象中 。 这使您可以编写作用于线程的函数及其数据。 在你的情况下,主线程可以有一个像requestUpdateConfirmation()这样的方法,在这里你可以阻塞调用线程,并在释放调用者之前等待主线程处理请求。