有人能帮我理解为什么我从代码片段中得到以下结果吗?如果更改lambda函数以获取至少1个参数:;有效ptr";两次这是在我的代码中的一个段故障崩溃中发现的。
Output:
valid ptr
nullptr
#include <iostream>
#include <memory>
#include <boost/asio.hpp>
auto getWrapper(boost::asio::io_context& ioContext)
{
auto sharedPtr = std::make_shared<int>(0);
return ioContext.wrap( [sharedPtr](){
if(sharedPtr == nullptr)
std::cout << "nullptrn";
else
std::cout << "valid ptrn";
});
}
int main()
{
boost::asio::io_context ioContext;
auto wrapper = getWrapper(ioContext);
wrapper();
wrapper();
ioContext.run();
}
首先必须实际使用一个strand,而io_context::wrap
已被弃用。所以让我们写
#include <iostream>
#include <memory>
#include <boost/asio.hpp>
auto getScheduleWrapper(boost::asio::io_context::strand& strand)
{
auto sharedPtr = std::make_shared<int>(0);
return [sharedPtr, &strand] () {
boost::asio::post(strand.context(),
boost::asio::bind_executor(strand, [sharedPtr] (){
if(sharedPtr == nullptr)
std::cout << "nullptrn";
else
std::cout << "valid ptrn";
}));
};
}
int main()
{
boost::asio::io_context ioContext;
boost::asio::io_context::strand strand{ioContext};
auto scheduleWrapper = getScheduleWrapper(strand);
scheduleWrapper();
scheduleWrapper();
ioContext.run();
}
这将输出
valid ptr
valid ptr
正如预期的那样。但请注意:线程并不能保证计划任务只运行一次,而实际上您正在计划它们两次。它们是";仅";保证在该链上一次只运行一个任务,并且它们将按照最初计划的顺序运行。