c++是否有一种方法可以有效地与线程通信而不中断他的工作
c++ Is there a way to effectively comunicate with thread without interrupting his job
我有以下场景:
我可以用一些参数创建一个对象,它将异步加载(使用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
- 添加2个变量,一个布尔标志和一个字符串与filePath。
- 当打开文件的线程发现有它正在寻找的文件时,设置标志为true,并设置filePath。等待条件变量 上的标志被更改
- 线程正在后台加载文件,每次加载文件时,它都会检查标志和filePath,如果标志设置为true并且它加载的文件如预期的那样通知线程。
相关文章:
- C++一个线程如何正确通信其任务已完成?
- 通过插槽和信号在不同线程中的两个qt对象之间进行通信
- 线程之间的通信不起作用 - C++
- 关于套接字通信的线程
- ZeroMQ:如何使用inproc减少多线程通信延迟
- 用于线程间通信的 Windows 套接字
- 与处理 ZeroMQ 的永久线程与 Qt 通信
- 与非主线程的 GUI 线程通信
- 使用 C++14 和 GLib (GDBus) 的线程通信
- 使用Protobuf进行线程通信
- C 14中的乘数交叉线程通信
- 串口读取功能的通信超时和线程不超时
- 使用PTHREDS与C 进行线程通信
- Qt中的多线程通信
- 远程、IPC 和线程场景中微服务的低延迟通信
- C++ - 多线程 - 线程之间的通信
- 线程中的通信丢失
- 与OpenSSL的多线程通信
- main()和线程()之间的通信
- Qt多线程通信