grpcc++异步服务器示例,在处理状态下是否需要互斥
grpc c++ async server example, is a mutex needed in the processing state?
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_上调用什么方法(。
- boost 是否有按特殊类型值编码状态"compact optional"?
- 检查两个节点在子节点上是否具有相同状态的更优雅的方法
- 在 nullptr 上调用无状态类的非静态成员函数是否合法?
- 是否很好地使用状态模式来维护当前选定的对象?
- GCC9是否允许避免std::变量的无值状态
- 如何确定boost msm中的特定状态是否为活动状态
- grpcc++异步服务器示例,在处理状态下是否需要互斥
- 验证(使用 static_assert)元组类型是否遵循某种顺序(有状态编译时检查)
- 对于每个线程,random_device是否以不同的状态启动?
- 对无状态派生类进行切片是否安全?
- 检测是否按下了某个键,而不是检测它是否始终处于关闭状态
- 检查特定应用程序的窗口是否处于最小化状态
- 如何在C API中检查MySql连接是否处于活动状态
- 类的堆分配对象是否在其作用域之后但在 C++ 中调用其析构函数之前处于活动状态
- HTTP响应标头是否可以不以状态行开头
- 如何跟踪Windows 7是否在C ++中以编程方式进入睡眠或休眠状态,就像在Windows XP中所做的那样
- 是否有一种直观的方式检查标志和状态
- 是否应将移出对象保留为"safe"状态?
- mutex::lock() 检查一次解锁状态是否已经被另一个线程锁定?
- 如何判断我的结构tm是否处于无效状态