2

我使用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 个线程,则服务器会正​​确处理和解析所有内容。
4

1 回答 1

2

似乎 boost::property_tree::read_json 默认情况下不是线程安全的。

您必须定义:

#define BOOST_SPIRIT_THREADSAFE
于 2013-08-21T05:02:15.183 回答