qicosmos / rest_rpc

modern C++(C++11), simple, easy to use rpc framework
MIT License
1.66k stars 365 forks source link

我在多线程中循环使用 RPC 会造成闪退。 #76

Open Codecing opened 1 year ago

Codecing commented 1 year ago

bool RepairClient::getTasksFromRepair(QString param, QString &error, QJsonDocument &doc, QNetworkAccessManager &) { //return m_network->getData(param, error, doc); std::thread thd[10]; for(int i=0;i<10;i++){ thd[i]=std::thread([param]{ Rpc rpc; QString error; QJsonDocument doc; bool ret=false; int i=0; while (1) { ret=rpc.getData(param,error,doc) ; std::this_thread::sleep_for(std::chrono::microseconds(20)); qDebug()<<QThread::currentThreadId()<<" "<<i++; }; }); } for(int i=0;i<10;i++){ if(thd[i].joinable()) { thd[i].join(); } } }

/////////////////////////////////////////////////////// /////////////////////////////////////////////////////// bool RepairRpcClient::getData(const QString &ip, const ushort port, const QMap<QString, QVariant> &param, QByteArray &byteData, QString &error) { RepairRpcProto::GetDataReq request; RepairRpcProto::GetDataResp response; bool isTrue = true; try { rpc_client client(ip.toStdString(), port); bool r = client.connect(); if (!r) { qCWarning(QLoggingCategory("RepairRpc")) << "connect timeout"; return false; }

    request.getReqParam = QString::fromLatin1(QJsonDocument::fromVariant(param).toJson()).toStdString();
    request.heartBeatReq = RepairRpcProto::HeartBeatReq::initHeartBeatReq();

    response = client.call<10000, RepairRpcProto::GetDataResp>(request.handlerKey, request);
} catch (const std::exception & e) {
    qCWarning(QLoggingCategory("RepairRpc")) << "request:" << request;
    qCWarning(QLoggingCategory("RepairRpc")) << "response" << response;
    qCWarning(QLoggingCategory("RepairRpc")) << e.what();
    error.append(e.what());
    isTrue = false;
}

if ((!request.heartBeatReq.uuid.empty()) && (response.heartBeatResp.fromUuid != request.heartBeatReq.uuid)) {
    error.append(QObject::tr("request uuid not same to response fromUuid ") + QString::fromStdString(request.getReqParam));
    return false;
}

int dataLength = qMin(response.getDataRespLength, static_cast<int>(response.getDataRespContent.size()));
dataLength = qMax(0, dataLength);
byteData.resize(dataLength);
byteData.fill('\0', dataLength);
memmove(byteData.data(), response.getDataRespContent.data(), static_cast<size_t>(dataLength));

QCryptographicHash dataReqMd5Hash(QCryptographicHash::Md5);
dataReqMd5Hash.addData(response.getDataRespContent.data(), dataLength);
if((response.getDataRespLength != dataLength)
        || (response.getDataRespMd5Hash != QString(dataReqMd5Hash.result().toHex()).toStdString())) {
    error.append(QObject::tr("response md5 not same to response md5 ") + QString::fromStdString(response.getRespParam));
    return false;
}

return isTrue;

}

/////////////////// 段错误 闪退点 epoll_reactor.ipp 245行 /////// mutex::scoped_lock descriptor_lock(descriptordata->mutex); //段错误 if (descriptordata->shutdown) { post_immediate_completion(op, is_continuation); return; } ////// /home/aoi/liiCode/RepairHome/repairTemp/repairService/restrpc/rest_rpc/thirdparty/asio/asio/detail/impl/epoll_reactor.ipp 245 stack Frame #0 /home/aoi/liiCode/RepairHome/repairTemp/repairService/restrpc/rest_rpc/thirdparty/asio/asio/detail/impl/reactive_socket_service_base.ipp 246 stack Frame #1 /home/aoi/liiCode/RepairHome/repairTemp/repairService/restrpc/rest_rpc/thirdparty/asio/asio/detail/reactive_socket_service_base.hpp 418 stack Frame #2 /home/aoi/liiCode/RepairHome/repairTemp/repairService/restrpc/rest_rpc/thirdparty/asio/asio/basic_stream_socket.hpp 1106 stack Frame #3 /home/aoi/liiCode/RepairHome/repairTemp/repairService/restrpc/rest_rpc/thirdparty/asio/asio/async_result.hpp 481 stack Frame #4 /home/aoi/liiCode/RepairHome/repairTemp/repairService/restrpc/rest_rpc/thirdparty/asio/asio/async_result.hpp 861 stack Frame #5 /home/aoi/liiCode/RepairHome/repairTemp/repairService/restrpc/rest_rpc/thirdparty/asio/asio/basic_stream_socket.hpp 1037 stack Frame #6 /home/aoi/liiCode/RepairHome/repairTemp/repairService/restrpc/rest_rpc/thirdparty/asio/asio/impl/read.hpp 380 stack Frame #7 /home/aoi/liiCode/RepairHome/repairTemp/repairService/restrpc/rest_rpc/thirdparty/asio/asio/impl/read.hpp 496 stack Frame #8 /home/aoi/liiCode/RepairHome/repairTemp/repairService/restrpc/rest_rpc/thirdparty/asio/asio/impl/read.hpp 528 stack Frame #9 /home/aoi/liiCode/RepairHome/repairTemp/repairService/restrpc/rest_rpc/thirdparty/asio/asio/async_result.hpp 481 stack Frame #10 /home/aoi/liiCode/RepairHome/repairTemp/repairService/restrpc/rest_rpc/thirdparty/asio/asio/async_result.hpp 861 stack Frame #11 /home/aoi/liiCode/RepairHome/repairTemp/repairService/restrpc/rest_rpc/thirdparty/asio/asio/impl/read.hpp 592 stack Frame #12 /home/aoi/liiCode/RepairHome/repairTemp/repairService/restrpc/rest_rpc/include/rest_rpc/rpc_client.hpp 790 stack Frame #13 /home/aoi/liiCode/RepairHome/repairTemp/repairService/restrpc/rest_rpc/include/rest_rpc/rpc_client.hpp 493 stack Frame #14 /home/aoi/liiCode/RepairHome/repairTemp/repairService/restrpc/rest_rpc/include/rest_rpc/rpc_client.hpp 555 stack Frame #15 /home/aoi/liiCode/RepairHome/repairTemp/repairService/restrpc/rest_rpc/thirdparty/asio/asio/impl/read.hpp 397 stack Frame #16 /home/aoi/liiCode/RepairHome/repairTemp/repairService/restrpc/rest_rpc/thirdparty/asio/asio/detail/bind_handler.hpp 288 stack Frame #17 /home/aoi/liiCode/RepairHome/repairTemp/repairService/restrpc/rest_rpc/thirdparty/asio/asio/handler_invoke_hook.hpp 87 stack Frame #18 /home/aoi/liiCode/RepairHome/repairTemp/repairService/restrpc/rest_rpc/thirdparty/asio/asio/detail/handler_invoke_helpers.hpp 54 stack Frame #19