“垃圾邮件”boost :: property_tree :: read_json时访问冲突

时间:2013-08-19 11:38:04

标签: c++ json boost boost-asio access-violation

我使用 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

这里得到了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个线程, 服务器正确处理和解析所有内容。

1 个答案:

答案 0 :(得分:2)

看起来像boost :: property_tree :: read_json默认情况下不是线程安全的。

您必须定义:

#define BOOST_SPIRIT_THREADSAFE