[protobuf] repeatfields线程对嵌入的消息是否安全?

时间:2020-08-10 07:28:57

标签: multithreading protocol-buffers

如果另一条消息中有消息对象的重复字段,在下面的示例中修改这些对象是否是线程安全的?

message Inner_messsage{
  repeated uint32 my_array = 1;
}

message Outer_message{
  repeated Innter_message my_array_squared = 1 [packed=true];
}

我认为由于紧密打包,protobuf实现可能会在更新时四处移动数据,从而使消息的使用不是线程安全的。这是真的? 使用竞技场时也是如此吗?

1 个答案:

答案 0 :(得分:0)

以下内容写在C++ API中:

协议缓冲区库中的线程安全遵循一个简单的规则:除非另有明确说明,否则同时使用多个线程中的对象始终是安全的,只要该对象在所有线程中都声明为const(或者,仅在>声明为const的情况下才允许使用)。但是,如果在一个线程中以某种对象无法访问的方式访问该对象,则在同一线程中同时访问该对象是不安全的。

简单地说,对一个对象的只读访问可以同时在多个线程中发生,但写访问一次只能在一个线程中发生。

因此,即使对于未重复的字段,更新消息也不是线程安全的。

相关问题