Код ниже работает отлично (т.е. не пропускает сообщения) в 99,9 раз.Но когда между дейтаграммами поступает микросхема дейтаграмм со скоростью 2-3 микросекунды, я испытываю потерю данных.Для вызова функции boost notify_one () требуется от 5 до 10 микросекунд, так что сам по себе является ключевым узким местом в этих условиях.Любые предложения о том, как улучшить производительность?
Поток кода получателя / "производителя":
if (bytes_recvd > 0) {
InQ.mut.lock();
string t;
t.append(data_, bytes_recvd);
InQ.msg_queue.push(t); // < 1 microsecs
InQ.mut.unlock();
InQ.cond.notify_one(); // 5 - 10 microsecs
}
Поток кода потребителя:
//snip......
std::string s;
while (1) {
InQ.mut.lock();
if (!InQ.msg_queue.empty()) {
s.clear();
s = InQ.msg_queue.front();
InQ.msg_queue.pop();
}
InQ.mut.unlock();
if (s.length()) {
processDatagram((char *)s.c_str(), s.length());
s.clear();
}
boost::mutex::scoped_lock lock(InQ.mut);
InQ.cond.wait(lock);
}