Это одна из причин, почему передача по значению в C ++ 98 не работает.
Поскольку вы хотите удерживать блокировку в течение минимально возможного времени, в C ++ 11 и C ++ 14 я сначала скопирую очередь, затем разблокирую мьютекс, затем переместим копию в функция (при условии, что queue
является подвижным).
int main() {
std::unique_lock<Mutex> lock(Que_mutex);
auto copy = Que;
lock.unlock();
queSizeCheck(std::move(copy));
}
Поскольку вопрос помечен C ++ 98, мы не можем использовать семантику перемещения. В этом случае я бы инкапсулировал копирование в отдельную функцию и полагался на то, что компилятор достаточно умен, чтобы применять elision copy:
queue<char> queCopy() {
// lock_guard is C++11 but you can easily write your own C++98 implementation
std::lock_guard<Mutex> lock(Que_mutex);
// hope the compiler is smart enough to directly initialize the parameter
// of queSizeCheck without incurring additional copies
return Que;
}
int main() {
queSizeCheck(queCopy());
}
Это зависит от того, что компилятор удаляет копию возвращаемого значения queCopy
и аргумента queSizeCheck
. И заканчивается тем, что код на самом деле более хорошо организован, чем код C ++ 11. Начиная с C ++ 17, это снова становится лучшим решением благодаря обязательному исключению копирования.
Все это предполагает разумную реализацию queue
, которая не была показана в вопросе.