Я работаю над многопоточной программой, в которой "std :: deque myBuffer" используется в качестве буфера FIFO, поток производителя постоянно добавляет пользовательские объекты в конец deque с помощью 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 &, поэтому, насколько я понимаю, только ссылка на первый элемент в deque передается объекту, и в результате, когда я вызываю pop_front (), указанный элемент должен быть удален, а переменная объектадержит недействительную ссылку.Удивительно, но когда я фактически запустил код, все работало в противоположность тому, что я ожидал.Так может ли кто-нибудь помочь мне понять, как работает "deque :: front () возвращает ссылку"?Спасибо.