使用 Boost::Asio 与我的 RestAPI 服务器建立 http 客户端连接,一切都很好,但不知何故 1/20 次我遇到了堆损坏
Using Boost::Asio for http client connection with my RestAPI server, things are good but somehow 1/20 times I hit with heap corruption
以下是实际代码库中的代码片段。请假设主机、端口、ioc 都可用并已初始化。
// Connection establisher class
class CSSLConn: public std::enable_shared_from_this<CSSLConn>
{
:
:
};
// Class for maintaining the thread pool
class CHttpClient
{
// vector to hold connction objects
std::vector <std::shared_ptr<CSSLConn>> m_sslConnObj{};
// main method call this to create connection
void CHttpClient::Initialize(int nThreads)
{
for (int x = 0; x < nThreadCount; ++x)
{
worker_threads_.create_thread(boost::bind(&CHttpClient::WorkerThread, this));
}
// let connection get established
std::this_thread::sleep_for(std::chrono::milliseconds(200));
}
// creating threads for thread pool
void CHttpClient::WorkerThread()
{
auto client = std::make_shared<CSSLConn>(ioc, m_ctx, sHost, sPort);
client->connect(sHost.c_str(), sPort.c_str());
m_sslConnObj.push_back(client);
ioc->run();
}
};
1/20 次我在尝试创建线程池时遇到堆损坏,主要是第二个线程。我怀疑 std::vector,因为它在推送时分配内存(但我不确定它是否是真正的罪魁祸首)。我正在维护连接向量以在最后断开所有连接。
有时崩溃发生在“boost::system::error_code background_getaddrinfo”函数,但这里的所有值看起来都不错。
我对boost不太熟悉,如果有人知道如何更好地调试它,我怎样才能看到Boost内部发生了什么,将对我有很大帮助。
我看到多个共享对象被多个线程访问
没有任何同步:
void WorkerThread() {
auto client = std::make_shared<CSSLConn>(ioc, m_ctx, sHost, sPort);
client->connect(sHost.c_str(), sPort.c_str());
m_sslConnObj.push_back(client);
ioc->run();
}
这里修改m_sslConnObj
,没有加锁。所以除非
这是某种线程安全的容器类型,已经
未定义
行为.
其他事情也是如此,例如m_ctx
。
您从中发布异步工作也是一种代码味道
单独的线程,好像这意味着什么。 io_context
是
运行 来自所有线程,所以你也可以只 运行 线程
并从主线程创建所有客户端。 他们仍然会
由所有工作线程提供服务。
刚刚注意到,CSSLConn
占用 sHost
也很奇怪
sPort
作为构造函数参数,但是当你调用
connect()
在他们身上你/再次/(但不同)。
以下是实际代码库中的代码片段。请假设主机、端口、ioc 都可用并已初始化。
// Connection establisher class
class CSSLConn: public std::enable_shared_from_this<CSSLConn>
{
:
:
};
// Class for maintaining the thread pool
class CHttpClient
{
// vector to hold connction objects
std::vector <std::shared_ptr<CSSLConn>> m_sslConnObj{};
// main method call this to create connection
void CHttpClient::Initialize(int nThreads)
{
for (int x = 0; x < nThreadCount; ++x)
{
worker_threads_.create_thread(boost::bind(&CHttpClient::WorkerThread, this));
}
// let connection get established
std::this_thread::sleep_for(std::chrono::milliseconds(200));
}
// creating threads for thread pool
void CHttpClient::WorkerThread()
{
auto client = std::make_shared<CSSLConn>(ioc, m_ctx, sHost, sPort);
client->connect(sHost.c_str(), sPort.c_str());
m_sslConnObj.push_back(client);
ioc->run();
}
};
1/20 次我在尝试创建线程池时遇到堆损坏,主要是第二个线程。我怀疑 std::vector,因为它在推送时分配内存(但我不确定它是否是真正的罪魁祸首)。我正在维护连接向量以在最后断开所有连接。
有时崩溃发生在“boost::system::error_code background_getaddrinfo”函数,但这里的所有值看起来都不错。
我对boost不太熟悉,如果有人知道如何更好地调试它,我怎样才能看到Boost内部发生了什么,将对我有很大帮助。
我看到多个共享对象被多个线程访问 没有任何同步:
void WorkerThread() { auto client = std::make_shared<CSSLConn>(ioc, m_ctx, sHost, sPort); client->connect(sHost.c_str(), sPort.c_str()); m_sslConnObj.push_back(client); ioc->run(); }
这里修改
m_sslConnObj
,没有加锁。所以除非 这是某种线程安全的容器类型,已经 未定义 行为.其他事情也是如此,例如
m_ctx
。您从中发布异步工作也是一种代码味道 单独的线程,好像这意味着什么。
io_context
是 运行 来自所有线程,所以你也可以只 运行 线程 并从主线程创建所有客户端。 他们仍然会 由所有工作线程提供服务。刚刚注意到,
CSSLConn
占用sHost
也很奇怪sPort
作为构造函数参数,但是当你调用connect()
在他们身上你/再次/(但不同)。