5

次のprotobufmsgを定義しています。

message Counts {
    repeated int32 counts = 1;
}

これはスレッド間RおよびWビルダーとして共有されます:

private final Counts.Builder countsBuilder;

スレッドRはからの読み取りcountsBuilderW書き込みのみを行いcountsBuilderます。共有ビルダーは、読み取り、書き込み、および(ある時点で)構築され、ネットワークを介して送信されます。

AFAIK、メッセージへの同時読み取りは問題ありませんが、開発者がより高いレベルで同期する必要があるものは他にありますか?だから、私は実際に共有ビルダーに同時に書き込みと読み取りを行うことはできませんか?

これが本質的にスレッドセーフではない場合、私は読み取り/書き込みに使用するある種のスレッドセーフCollection<Integer>を使用することを考えており、ネットワーク経由で送信する直前に(ある時点で)まったく新しいメッセージを作成します。それとも私は何かが足りないのですか?

ありがとう!

編集1:私はprotobuf2.4.1とjava6を使用しています

編集2:いくつかの用語とスペルの修正。

4

2 に答える 2

2

読み取りと書き込みの両方を同期すれば問題ありません。

synchronized (countsBuilder) {
   // modify countsBuilder
}

ただし、メッセージを作成するときに競合状態がないことも確認する必要があることを忘れないでください。メッセージが作成された後は、書き込みスレッドは書き込みを行うことができません。

于 2012-04-22T18:50:53.920 に答える
2

https://developers.google.com/protocol-buffers/docs/reference/cppによると、C++ ではスレッドセーフではありません。

また、Javaではありませんhttps://developers.google.com/protocol-buffers/docs/reference/java-generated

最近この問題に遭遇しましたが、これを見つけました。C ++で言ったことは次のとおりです

スレッドセーフに関する注意:

Protocol Buffer ライブラリのスレッド セーフは単純な規則に従います。特に明記されていない限り、オブジェクトがすべてのスレッドで const と宣言されている限り (または、ある方法でのみ使用される限り)、複数のスレッドからオブジェクトを同時に使用しても常に安全です。 const と宣言されている場合は許可されます)。ただし、オブジェクトが const である場合に許可されない方法で 1 つのスレッドでアクセスされる場合、他のスレッドでそのオブジェクトに同時にアクセスすることは安全ではありません。

簡単に言えば、オブジェクトへの読み取り専用アクセスは複数のスレッドで同時に発生する可能性がありますが、書き込みアクセスは一度に 1 つのスレッドでしか発生できません。

Javaで言った:

ビルダーはスレッドセーフではないことに注意してください。そのため、複数の異なるスレッドが単一のビルダーの内容を変更する必要がある場合は常に Java 同期を使用する必要があります。

于 2020-05-08T06:39:39.473 に答える