Зависит от того, что вы ожидаете.Другие ответы верны: в общем , стандартные контейнеры C ++ не являются поточно-ориентированными, и, кроме того, что в частности ваш код не защищает другой поток, изменяющий контейнер между вашимивызов empty
и получение блокировки (но этот вопрос не связан с безопасностью потока vector::empty
).
Итак, чтобы предотвратить любые недоразумения: Ваш код не гарантирует items
будет непустым внутри блока.
Но ваш код все еще может быть полезен, поскольку все, что вы хотите сделать, - это избегать создания избыточных блокировок.Ваш код не дает гарантий, но он может предотвратить ненужное создание блокировки.Это не будет работать во всех случаях (другие потоки могут по-прежнему очищать контейнер между проверкой и блокировкой), но в некоторых случаях.И если все, что вам нужно, это оптимизация, исключив избыточную блокировку, то ваш код достигает этой цели.
Просто убедитесь, что любой фактический доступ к контейнеру равен защищено блокировками.
Кстати, это строго говоря неопределенное поведение : теоретически реализация STL позволяет изменять mutable
членов внутрипозвоните на empty
.Это будет означать, что очевидно безвредный (потому что только для чтения) вызов empty
может фактически вызвать конфликт.К сожалению, вы не можете полагаться на предположение, что вызовы только для чтения безопасны с контейнерами STL.
На практике, однако, я вполне уверен, что vector::empty
не будет не изменить любой членов.Но уже на list::empty
я менее уверен.Если вы действительно хотите, чтобы гарантировал , то либо блокируйте каждый доступ, либо не используйте контейнеры STL.