0

を使用しています。 はメッセージのソースを指し、 はメッセージをmap<int, queue<string>>保持します。1 つのスレッドがメッセージをキューにプッシュし、別のスレッドがメッセージをキューからプッシュします。intqueue

これはクライアント サーバー プログラムです。クライアントがメッセージを送信すると、メッセージはキューにプッシュされます。

私は現在使用しています(疑似コード)

/*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()スレッドセーフにするのに役立ちますか?

4

1 に答える 1