LINUX.ORG.RU

Потокобезопастность в GRPC

 ,


0

1

Привет, всем! Помогите поставить блокировки. Имеется некоторый класс 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;
}
Хотя, не нормально скорее всего. Ведь Write() уйдет в поток, но реально может еще не выполниться <-- здесь не понятно что внутри Write из grpc.

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;
}

похоже допер

mutex m_document;
string document;

Status ListFeatures(ServerContext* context, const Rectangle* rectangle,
                    ServerWriter<GetSomeResponse>* writer) override {
  GetSomeResponse reply;
  while(SomeCondition) {
    // ...
    {
        unique_lock lck {m_reply_1};
        document = objectSomeClass.someHardWorkCalculation();
        
    }
    reply.set_document(document);
    // ...
    string doc;
    {
        shared lock lck {m_reply_1};
        doc = DeepCopy(document);
    }
    reply.set_document(doc);
    writer->Write(reply);
  }
  return Status::OK;
}
fffafasnow
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.