c++是否有一种方法可以有效地与线程通信而不中断他的工作

c++ Is there a way to effectively comunicate with thread without interrupting his job

本文关键字:通信 线程 中断 工作 有效地 是否 方法 一种 c++      更新时间:2023-10-16

我有以下场景:

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

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

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

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

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

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

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