を使用しています。 はメッセージのソースを指し、 はメッセージをmap<int, queue<string>>
保持します。1 つのスレッドがメッセージをキューにプッシュし、別のスレッドがメッセージをキューからプッシュします。int
queue
これはクライアント サーバー プログラムです。クライアントがメッセージを送信すると、メッセージはキューにプッシュされます。
私は現在使用しています(疑似コード)
/*receive message in thread 1*/
map<int, queue<string>> test_map;
int client_id = 2;
string msg = received_from_client(client_id);
testmap[client_id].push(msg);
/*process message in thread 2*/
string msg_to_process testmap[client_id].front();
test_map[client_id].pop();
if (testmap[client_id].empty())
{
testmap.erase(client_id);
}
この質問から、insert は既存のキーを上書きしないという違いがあることがわかります。これは、物事をキューにプッシュするときに適用されますか? 挿入を使用する方が安全ですか、それとも私が行っていることは[]
十分ですか?
また、システムは一度に 1 つのメッセージのみをキューに入れる必要がありますが、私は を使用するmap<int, queue>
代わりに を使用して拡張を許可してmap<int,string>
います。
編集:マルチスレッドについても質問があります-キューが空であるため(メッセージを処理した後)、スレッド2がキーを削除しているときに、スレッド1がマップに挿入しようとするとどうなりますか。それはこれに対する定量的な答えですか、それを使用し[]
たり、insert()
スレッドセーフにするのに役立ちますか?