Я работаю над многопоточной программой, в которой "std::deque‹ MyObject > myBuffer" используется в качестве буфера FIFO, поток-производитель постоянно добавляет пользовательские объекты в конец очереди с помощью push_back(), а поток-потребитель использует вспомогательная функция для извлечения объекта и обработки синхронизации и мьютекса.
std::deque< MyObject > myBuffer;
std::mutex mtx;
int main() {
std::thread producerThread(producer());
std::thread consumerThread(consumer());
// other code
return 0;
}
Функция продюсера:
void producer() {
while (somecondition) {
// code producing MyObject object
std::lock_guard<std::mutex> lck(mtx);
myBuffer.push_back(object);
}
}
Потребительская функция:
void consumer() {
while(somecondition) {
MyObject object1, object2;
if (retrieve(object1)) {
// process object1
}
if (retrieve(object2)) {
// process object2
}
}
}
Моя текущая вспомогательная функция выглядит так:
bool retrieve(MyObject & object) {
// other code ...
std::lock_guard<std::mutex> lck(mtx);
if (!myBuffer.empty()) {
object = myBuffer.front();
myBuffer.pop_front();
return true;
} else {
return false;
}
}
Однако я быстро понял, что deque::front() возвращает ссылку на первый элемент в контейнере. А «объект» — это MyObject&, поэтому, насколько я понимаю, объекту передается только ссылка на первый элемент в двухсторонней очереди, и в результате, когда я вызываю pop_front(), указанный элемент должен исчезнуть, а объектная переменная содержит недействительную ссылку. Удивительно, но когда я действительно запускал код, все работало не так, как я ожидал. Так может ли кто-нибудь помочь мне понять, как работает этот «deque::front() возвращает ссылку»? Спасибо.