我使用Boost Asio (1.53.0) 制作了一个简单的 TCP 服务器。服务器接受 JSON 请求,使用boost::property_tree::read_json解析它们。
为了测试可靠性,我创建了一个简单的应用程序,它创建了 128 个线程并且它们不断地发送请求。
几秒钟后,服务器因访问冲突而崩溃:
Unhandled exception at 0x000007FEFD829E5D (KernelBase.dll) in RPC_Server.exe: 0xC0000005: Access violation reading location 0xFFFFFFFFFFFFFFFF.
msvcr110d.dll!__RethrowException(EHExceptionRecord * pThisException) Line 1217
msvcr110d.dll!__CxxCallCatchBlock(_EXCEPTION_RECORD * pExcept) Line 1279
ntdll.dll!0000000077360c21()
RPC_Server.exe!json::json::Parse(std::basic_string<char,std::char_traits<char>,std::allocator<char> > & sJson) Line 28
这里 get 的 read_json 被称为:
rpc::request json::Parse(std::string sJson)
{
try {
std::stringstream ss;
ss << sJson;
boost::property_tree::ptree pt;
boost::property_tree::read_json(ss, pt);
...
}
- 如果我注释掉 read_json 行,服务器会正确处理所有内容。
- 如果我将测试应用程序减少到例如只有 1 个线程,则服务器会正确处理和解析所有内容。