我有以下情况:
我可以使用一些参数创建一个对象,它将异步加载(使用boost::thread
)一个目录,该目录将包含许多子目录,并且有许多文件,并保存到磁盘上的特定目录。这些文件可以从网络或其他任何内容加载,可能需要几分钟才能完成这项工作。
创建对象后,用户可能希望加载一个特定文件。现在我正在检查文件是否存在(意味着线程已经下载了它),否则我可以调用thread.join()
来确保所有文件都被加载或者每100毫秒检查文件是否存在或者像这样。但是有没有办法更好地完成它,这意味着正在执行其工作的线程将在加载所需文件时通知我,使用某些回调或类似的那样?
答案 0 :(得分:0)
正如你所说,你可以使用一个回调,例如你可以在线程中有一组观察到的文件,对于每个下载的文件,你在集合中搜索,如果你刚刚下载的文件在那里,你就会开火回调,可能在另一个线程中,因此线程将继续其工作。尝试使用一个集合来查找更快,例如更快,然后在向量中搜索。
答案 1 :(得分:0)
我建议您使用并发容器(MS VC ++中的本机实现,Linux替代方案:Intel TBB),只需将下载的文件添加到其中:)然后您可以发出.find或其他任何内容。
通过这种方式,您不必担心锁和其他威胁安全问题。
答案 2 :(得分:0)
使用boost :: condition变量http://www.boost.org/doc/libs/1_53_0/doc/html/thread/synchronization.html