grpcc++异步服务器示例,在处理状态下是否需要互斥

grpc c++ async server example, is a mutex needed in the processing state?

本文关键字:是否 状态 处理 服务器 异步 grpcc++      更新时间:2023-10-16

grpc++示例有以下注释。

// Spawn a new CallData instance to serve new clients while we process
// the one for this CallData. 

我对这句话有点困惑,因为它似乎表明新的CallData实例可能同时为不同的客户端服务。(这是一个事件循环吗?(

但是,我没有看到在这个例子中创建任何新的线程。我认为没有创建新线程,CallData可能作用的任何共享变量都不需要互斥体,这是正确的吗?或者互斥是必要的吗?

例如,如果示例中的代码更改为下面的代码,我是否需要一个互斥体?

...
else if (status_ == PROCESS) {
// Spawn a new CallData instance to serve new clients while we process
// the one for this CallData. The instance will deallocate itself as
// part of its FINISH state.
new CallData(service_, cq_);
// Do I need a mutex here?
// mutex.lock()
service->do_something_to_variable();
// mutex.unlock()
std::string prefix("Hello ");
reply_.set_message(prefix + request_.name());

我会尽力回答您的每一个问题。

我对这句话有点困惑,因为它似乎暗示新的CallData>实例可能同时为不同的客户端服务。(这是一个事件>循环吗?(

这里的事件循环是HandleRpcs((中cq_->Next((上的循环。创建一个新的CallData开始了为另一个客户端提供服务的过程(您可以在其构造函数中看到,它调用service_->RequestSayHello,这使系统能够处理另一个传入的RPC(。一旦调用它,就会将有关新传入rpc的事件添加到完成队列中。如果上一个rpc尚未完成,则该rpc的事件将添加到完成队列中。这意味着我们使用新的CallData来处理新的rpc,同时使用旧的CallData处理以前的rpc。

我假设没有创建新线程和任何共享变量是正确的吗CallData可能对其执行操作,而不需要互斥?或者互斥是必要的吗?

对,因此在本例中没有创建新线程。唯一正在运行的线程是运行HandleRpcs((的线程。因此,当我在上面的回答中谈到"并发"时,这指的是在任何时候都有多个正在进行的rpc(每个rpc都有自己的CallData(,但处理实际上并不是并发的,因为示例应用程序中只有一个线程。现在,如果图片中有多个线程,那么使用互斥来保护CallData的状态可能是个好主意(这取决于是否可以共享对该状态的访问(。

例如,如果示例中的代码更改为以下代码,我是否需要一个互斥体?

如果您所写的是对代码的唯一更改,那么不,您不需要互斥锁(而且我不确定您试图在service_上调用什么方法(。