我正在使用 a map<int, queue<string>>
,其中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);
}
我从这个问题中知道,不同之处在于插入不会覆盖现有的密钥——当我将东西推入队列时这是否适用?使用插入是否更安全,或者我正在做的事情是否[]
足够?
另外 - 虽然系统在任何时候都应该只有一条消息在队列中,但我正在通过使用map<int, queue>
而不是使用map<int,string>
.
编辑:我也有一个关于多线程的问题 - 当线程 1 尝试插入映射而线程 2 删除键时会发生什么,因为队列是空的(在它处理完消息之后)。这是对此的定量回答,是否使用[]
或insert()
帮助使其不再是线程安全的?