1

我有以下情况:

我可以创建一个带有一些参数的对象,它将异步加载(使用boost::thread)一个目录,该目录将有许多子目录和许多文件,并保存到磁盘上的特定目录。这些文件可以从网络或其他任何地方加载,完成这项工作可能需要几分钟。

在创建对象之后,用户可能想要加载一个特定的文件。现在我正在检查文件是否存在(意味着线程已经下载了它),否则我可以调用thread.join()以确保所有文件都已加载或每 100 毫秒检查文件是否存在或类似的东西。但是有没有办法做得更好,这意味着正在做他的工作的线程会在加载想要的文件时通知我,使用一些回调或类似的东西?

4

3 回答 3

0

我建议您使用并发容器(MS VC++ 中的本机实现,Linux 替代方案:Intel TBB)并将下载的文件添加到其中:) 然后您可以发出 .find 或其他任何内容。

这样您就不必担心锁和其他威胁安全的东西。

于 2013-05-27T16:33:13.917 回答
0

使用 boost::condition 变量 http://www.boost.org/doc/libs/1_53_0/doc/html/thread/synchronization.html

  1. 添加 2 个变量,一个布尔标志和一个带有 filePath 的字符串。
  2. 当正在打开文件的线程发现有它正在寻找的文件时,将标志设置为 true,并设置 filePath。等待在条件变量上更改标志
  3. 每次加载文件时都在后台加载文件的线程检查标志和文件路径,如果标志设置为真并且它加载的文件按预期通知线程。
于 2013-05-28T14:38:01.873 回答
0

如您所说,您可以使用回调,例如,您可以在线程中有一组观察到的文件,并且对于下载的每个文件,您都在该集中搜索,如果您刚刚下载的文件在那里,则触发回调,可能在另一个线程中,因此该线程将继续其工作。尝试使用集合来查找会更快,例如比在向量中搜索更快。

于 2013-05-27T11:55:17.977 回答