std::shared_future
时间: 2023-05-01 21:03:34 浏览: 53
std::shared_future是C++标准库中的一个类,可以让多个线程共享一个future的状态。它允许多个线程等待同一个future,而不会造成竞争条件。它还支持延迟的访问任务结果,因为它可以在任务完成之前将共享状态传递给另一个线程。这个类可以使用future获取异步任务的结果,也可以使用promise设置异步任务的结果。
相关问题
#include <vector> #include <queue> #include <thread> #include <mutex> #include <condition_variable> #include <functional> #include <future> class ThreadPool { public: ThreadPool(size_t threads) : stop(false) { for (size_t i = 0; i < threads; ++i) { workers.emplace_back([this] { for (;;) { std::function<void()> task; { std::unique_lockstd::mutex lock(this->queue_mutex); this->condition.wait(lock, [this] { return this->stop || !this->tasks.empty(); }); if (this->stop && this->tasks.empty()) return; task = std::move(this->tasks.front()); this->tasks.pop(); } task(); } }); } } ~ThreadPool() { { std::unique_lockstd::mutex lock(queue_mutex); stop = true; } condition.notify_all(); for (std::thread &worker : workers) worker.join(); } template<class F, class... Args> auto enqueue(F&& f, Args&&... args) -> std::future<typename std::result_of<F(Args...)>::type> { using return_type = typename std::result_of<F(Args...)>::type; auto task = std::make_shared<std::packaged_task<return_type()>>(std::bind(std::forward<F>(f), std::forward<Args>(args)...)); std::future<return_type> res = task->get_future(); { std_lockstd::mutex lock(queue_mutex); if (stop) throw std::runtime_error("enqueue on stopped ThreadPool"); tasks.emplace([task] { (*task)(); }); } condition.notify_one(); return res; } private: std::vectorstd::thread workers; std::queue<std::function<void()>> tasks; std::mutex queue_mutex; std::condition_variable condition; bool stop; }; 怎么获取结果
可以使用`std::future`来获取线程池中任务的返回值。在`enqueue`函数中,任务被包装在`std::packaged_task`中,这个包装器可以将一个函数包装成一个可调用对象,并且可以使用`std::future`来获取函数的返回值。
在`enqueue`函数中,我们使用`std::make_shared`创建了一个`std::packaged_task`,并将要执行的任务`f`和其参数`args`绑定在一起。然后,我们将这个`std::packaged_task`封装在一个`std::shared_ptr`中,以便可以在其他线程中访问它。
接下来,我们使用`std::future`获取`std::packaged_task`的返回值。`std::future`是一个异步结果的占位符,可以用来检查任务是否已经完成,并且可以获取任务的返回值。
具体地,我们可以在调用`enqueue`函数后,使用返回的`std::future`对象的`get()`函数来获取任务的返回值。`get()`函数会阻塞当前线程,直到任务执行完毕并返回结果。
例如,假设我们要执行一个函数`int add(int x, int y)`,我们可以使用以下方式来获取其结果:
```c++
ThreadPool pool(4); // 创建线程池,有4个线程
// 将任务加入线程池,并获取返回值的future对象
auto result = pool.enqueue(add, 3, 4);
// 等待任务执行完成,并获取返回值
int res = result.get();
std::cout << "3 + 4 = " << res << std::endl;
```
这里的`result.get()`会阻塞当前线程,直到任务执行完毕并返回结果。最后,我们将`res`输出到控制台。
std::future std::promise
std::future是一个模版类,用于获取异步操作的结果。它是不可拷贝对象,类似于std::unique_ptr,具有对所管理的资源的独占权。通过std::future,你可以从std::promise获得相应的值,询问std::promise是否将值设置为可用,等待std::promise的通知,可以设置一个相对时间间隔或绝对时间,还可以创建一个共享的future(std::shared_future)。
std::promise是用于在多线程编程中实现单向数据传递的一种方式。它是数据的输入端,而std::future则是数据的输出端。通过std::promise和std::future,可以在不同的线程之间传递数据。
总结来说,std::future和std::promise是用于在多线程环境下进行数据传递和同步的重要工具。std::future用于获取异步操作的结果,而std::promise用于将数据传递给std::future。它们在C++中提供了一种方便且安全的方式来处理多线程间的数据共享和通信。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* *2* *3* [c++11 多线程之future和promise](https://blog.csdn.net/weixin_44834554/article/details/127515771)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"]
[ .reference_list ]