我使用 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);
...
}
答案 0 :(得分:2)
看起来像boost :: property_tree :: read_json默认情况下不是线程安全的。
您必须定义:
#define BOOST_SPIRIT_THREADSAFE