上诉代码提升std没有future
时间: 2024-10-19 21:02:50 浏览: 29
如果不想使用 `std::future` 和等待,可以使用 `std::thread` 直接创建和管理每个线程,但是这种方法需要手动控制线程的生命周期和同步,相对复杂一些。以下是使用 `std::thread` 实现异步图像旋转的代码示例:
```cpp
#include <iostream>
#include <string>
#include <vector>
#include <thread>
// 假设 RotateJPEG 是一个耗时的操作,我们在这里仅作为示例给出
void RotateJPEG(std::string path) {
// ... 实现具体的图片旋转逻辑
std::cout << "Rotating JPEG for " << path << std::endl;
}
void process_image_async(const std::string& path) {
RotateJPEG(path);
}
int main() {
// 待处理的文件路径
std::vector<std::string> image_paths = {"path1.jpg", "path2.jpg", "path3.jpg"};
// 创建一个线程池来处理图像
const size_t thread_pool_size = std::thread::hardware_concurrency(); // 使用系统线程数
std::vector<std::thread> threads(thread_pool_size);
size_t processed_files = 0;
// 启动线程并执行旋转任务
for (size_t i = 0; i < image_paths.size(); ++i) {
if (threads.size() > 0 && processed_files >= thread_pool_size) { // 防止一次性创建太多线程
// 等待前一个线程完成
while (!threads.back().joinable()) {
threads.back().join();
threads.pop_back();
}
}
// 创建新线程处理下一个任务
threads.push_back(std::thread(process_image_async, image_paths[i]));
++processed_files;
}
// 等待所有线程完成
for (auto& t : threads) {
t.join();
}
std::cout << "All rotations completed." << std::endl;
return 0;
}
```
在这个版本中,我们首先创建一个线程池,其大小等于系统的可用核心数。然后逐个启动线程,确保任何时候线程池不超过预设的大小,以便更好地利用CPU资源。当线程池满时,我们会等待最后一个线程完成再启动新的。
注意,这种实现需要手动控制线程的调度和同步,比 `std::future` 更加底层,维护起来可能会更复杂一些,并且可能出现线程安全的问题。在实际项目中,考虑使用专门的并发库(如 C++17 的 `<execution>` 标准库)或第三方库(如 Boost.Thread)可能会更好。
阅读全文