在这种情况下我应该如何使用thread_pool?

Rob*_*sov 1 c++ multithreading boost-asio threadpool

例如:当我编写这段代码时,我收到了正确的结果。

boost::asio::thread_pool t(3);
std::vector<int> vec = {10,20,30};
boost::asio::post(t, [&]{ foo(vec[0]);});
boost::asio::post(t, [&]{ foo(vec[1]);});
boost::asio::post(t, [&]{ foo(vec[2]);});
t.join();
Run Code Online (Sandbox Code Playgroud)

但是当我想在 for-cicle 中使用 boost::asio::post 时,我收到错误 Microsoft Visual C++ Runtime Library:“表达式:向量下标超出范围”

boost::asio::thread_pool t(3);
std::vector<int> vec = {10,20,30};
for (int i = 0; i < 3; ++i) {
    boost::asio::post(t, [&]{ foo(vec[i]);});
}
t.join();
Run Code Online (Sandbox Code Playgroud)

我该怎么做才能让我的最后一种方法返回正确的答案?

Dre*_*ann 5

您正在i通过引用捕获异步使用的 lambda。当t.join();达到时,i是一个悬空引用

按值捕获它,这样它就不会更改或过期。

boost::asio::post(t, [&,i]{ foo(vec[i]);});
Run Code Online (Sandbox Code Playgroud)