Я использую map<int, queue<string>>
, где int
ссылается на источник сообщения, а queue
содержит сообщение. Один поток помещает сообщения в очередь, другой поток выталкивает их из очереди.карты очередей очередей: используя [] vs .insert
Это клиент-серверная программа - когда клиент отправляет сообщение, сообщение попадает в очередь.
настоящее время я использую (псевдокод)
/*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);
}
Я знаю, что из этого question, что разница в том, что вставка не будет перезаписывать существующий ключ - это применить, когда я толкая вещи в очередях? Безопаснее ли использовать вставку, или это то, что я делаю с []
?
Также - в то время как система должна только одно сообщение в очереди в любое время, я делаю пособие расширения с помощью map<int, queue>
вместо использования map<int,string>
.
редактировать: У меня есть вопрос о множественной резьбе, а также - что происходит, когда нить 1 попытку вставить карту в то время как поток 2 удаляет ключ, потому что очередь пуста (после того, как он обработал сообщение). Является ли это количественным ответом на это, и использует ли []
или insert()
помочь сделать его более поточным?
В дополнение к тому, что может возникнуть в связи с некоторыми интересными проблемами параллелизма, когда вы вводите в него потоковую обработку, управление использованием 'operator []' для индексирования очереди идентификатора клиента для вставки, переднего и поп-шаблона выглядит корректно здесь , Вы можете использовать интеллектуальные указатели для своего значения карты, если вы планируете использовать это в многопоточной среде (по причинам, которые вы обнаружите, когда вы туда попадете). – WhozCraig
Я на самом деле задаю этот вопрос, потому что программа иногда ломается - все еще проверяя причину - у меня есть другой вопрос о вставке и удалении - я отредактирую вопрос! – sccs
. Тогда возникает вопрос, как этот код разбивается на многопоточную среду? (происходит ли первоначальная невысказанная, недокументированная и, следовательно, неизвестная ошибка в однопоточном контексте)? – WhozCraig