asio::io_service::run 在 boost::asio::io_service::work 被销毁后不 return
asio::io_service::run doesnt return after boost::asio::io_service::work is destroyed
正如标题所说,我遇到了这个问题,但我不明白为什么会出现这个帖子
即使在 Client
的析构函数销毁 asio::io_service::work
变量后 运行 也不会停止
当我运行这个程序输出总是这样
有人看到我在这里遗漏了什么吗?
#include <boost/asio.hpp>
#include <thread>
#include <atomic>
#include <memory>
using namespace boost;
class Client{
public:
Client(const Client& other) = delete;
Client()
{
m_work.reset(new boost::asio::io_service::work(m_ios));
m_thread.reset(new std::thread([this]()
{
m_ios.run();
}));
}
~Client(){ close(); }
private:
void close();
asio::io_service m_ios;
std::unique_ptr<boost::asio::io_service::work> m_work;
std::unique_ptr<std::thread> m_thread;
};
void Client::close()
{
m_work.reset(nullptr);
if(m_thread->joinable())
{
std::cout << "before joining thread" << std::endl;
m_thread->join();
std::cout << "after joining thread" << std::endl;
}
}
int main()
{
{
Client client;
}
return 0;
}
编辑
在 StPiere 评论之后,我将代码更改为这个并且它起作用了:)
class Client{
public:
Client(const Client& other) = delete;
Client()
{
m_work.reset(new boost::asio::executor_work_guard<boost::asio::io_context::executor_type>(boost::asio::make_work_guard(m_ios)));
m_thread.reset(new std::thread([this]()
{
m_ios.run();
}));
}
~Client(){ close(); }
private:
void close();
asio::io_context m_ios;
std::unique_ptr<boost::asio::executor_work_guard<boost::asio::io_context::executor_type>> m_work;
std::unique_ptr<std::thread> m_thread;
};
我无法在任一编译器上重现错误。
这里 example 用于 gcc 9.3 和 boost 1.73
通常,作品析构函数会在 windows 上使用类似 InterLockedDecrement
的东西来减少未完成作品的数量。
看起来像是一些编译器或 io_service/work 实现问题。
如评论中所述,io_service
和 io_service::work
在 io_context
和 executor_work_guard
方面 已弃用 。
正如标题所说,我遇到了这个问题,但我不明白为什么会出现这个帖子
即使在 Client
的析构函数销毁 asio::io_service::work
变量后 运行 也不会停止
当我运行这个程序输出总是这样
有人看到我在这里遗漏了什么吗?
#include <boost/asio.hpp>
#include <thread>
#include <atomic>
#include <memory>
using namespace boost;
class Client{
public:
Client(const Client& other) = delete;
Client()
{
m_work.reset(new boost::asio::io_service::work(m_ios));
m_thread.reset(new std::thread([this]()
{
m_ios.run();
}));
}
~Client(){ close(); }
private:
void close();
asio::io_service m_ios;
std::unique_ptr<boost::asio::io_service::work> m_work;
std::unique_ptr<std::thread> m_thread;
};
void Client::close()
{
m_work.reset(nullptr);
if(m_thread->joinable())
{
std::cout << "before joining thread" << std::endl;
m_thread->join();
std::cout << "after joining thread" << std::endl;
}
}
int main()
{
{
Client client;
}
return 0;
}
编辑
在 StPiere 评论之后,我将代码更改为这个并且它起作用了:)
class Client{
public:
Client(const Client& other) = delete;
Client()
{
m_work.reset(new boost::asio::executor_work_guard<boost::asio::io_context::executor_type>(boost::asio::make_work_guard(m_ios)));
m_thread.reset(new std::thread([this]()
{
m_ios.run();
}));
}
~Client(){ close(); }
private:
void close();
asio::io_context m_ios;
std::unique_ptr<boost::asio::executor_work_guard<boost::asio::io_context::executor_type>> m_work;
std::unique_ptr<std::thread> m_thread;
};
我无法在任一编译器上重现错误。 这里 example 用于 gcc 9.3 和 boost 1.73
通常,作品析构函数会在 windows 上使用类似 InterLockedDecrement
的东西来减少未完成作品的数量。
看起来像是一些编译器或 io_service/work 实现问题。
如评论中所述,io_service
和 io_service::work
在 io_context
和 executor_work_guard
方面 已弃用 。