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 つのスレッドだけに減らすと、サーバーはすべてを正しく処理および解析します。