Потокобезопастность в GRPC
Привет, всем! Помогите поставить блокировки. Имеется некоторый класс SomeClass, с некоторым методом someHardWorkCalculation(), выполняющем длительные линейные расчеты. Судя по документации строка с присвоением данных f и реальная отправка данных происходят асинхронно (в разных потоках). Как заставить работать вот эту конструкцию потокобезопастно?
Status ListFeatures(ServerContext* context, const Rectangle* rectangle,
ServerWriter<GetSomeResponse>* writer) override {
GetSomeResponse reply;
while(SomeCondition) {
// ...
std::string document = objectSomeClass.someHardWorkCalculation();
reply.set_document(document);
// ...
writer->Write(reply);
}
return Status::OK;
}
Вот такая схема нормально выглядит?
mutex m_reply_1;
Status ListFeatures(ServerContext* context, const Rectangle* rectangle,
ServerWriter<GetSomeResponse>* writer) override {
GetSomeResponse reply;
while(SomeCondition) {
// ...
{
unique_lock lck {m_reply_1};
std::string document = objectSomeClass.someHardWorkCalculation();
reply.set_document(document);
}
// ...
{
shared lock lck {m_reply_1};
writer->Write(reply);
}
}
return Status::OK;
}
P.S. [https://www.grpc.io/docs/languages/cpp/basics/]
В документации рассматривается пример, в котором отсылается данные из feature_list_, который в свою очередь должен быть потокобезопастным, так как методы GRPC работают в разных потоках. Отсюда я делаю вывод, что Write() может работать в потоке, отличном от ListFeature.
Status ListFeatures(ServerContext* context, const Rectangle* rectangle,
ServerWriter<Feature>* writer) override {
for (const Feature& f : feature_list_) {
// ...
writer->Write(f);
}
}
return Status::OK;
}