c ++有没有办法在不中断工作的情况下有效地与线程进行通信

时间:2013-05-27 10:15:03

标签: c++ boost asynchronous boost-thread

我有以下情况:

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

创建对象后,用户可能希望加载一个特定文件。现在我正在检查文件是否存在(意味着线程已经下载了它),否则我可以调用thread.join()来确保所有文件都被加载或者每100毫秒检查文件是否存在或者像这样。但是有没有办法更好地完成它,这意味着正在执行其工作的线程将在加载所需文件时通知我,使用某些回调或类似的那样?

3 个答案:

答案 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

  1. 添加2个变量,一个布尔标志和一个带有filePath的字符串。
  2. 当打开文件的线程发现有正在查找的文件时,将标志设置为true,并设置为filePath。等待条件变量
  3. 上的标志被更改
  4. 每次加载文件时在后台加载文件的线程它会检查标志和filePath,如果标志设置为true并且加载的文件是预期的,则通知线程。