【发布时间】:2013-08-19 11:38:03
【问题描述】:
我使用 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个线程, 服务器正确处理和解析所有内容。
【问题讨论】:
-
我注意到您将
sJson作为参考。字符串本身存储在哪里?是否可以与其他线程共享(并被其他线程修改)? -
也试过By-Value,没关系。
-
作为一个实验,将线程数减少到只有一个。如果发生这种情况以消除访问冲突,那么这意味着问题很可能是由于多线程问题造成的。如果可行,则再次增加线程,但在 read_json 代码周围放置一些关键部分或互斥锁。
-
示例代码显示字符串参数作为副本传递,并且所有其他变量都已添加到堆栈中。线程无关紧要。当 read_json 完成时,我也会崩溃,如果我猛击它。
标签: c++ json boost boost-asio access-violation