какой из них быстрее concurrent_queue <> против очереди мьютекса <> во время итерации - PullRequest
1 голос
/ 26 января 2011

предположим, что вы хотите перебрать все элементы в очереди, которые реализованы с использованием concurrent_queue<> и std:queue<>.

Так как на concurrent_queue<> нет итератора, поэтому я могу только думать, что мне нужно делать try_pop() и push(), пока вы не откроете и не нажмете повторно все элементы в concurrent_queue<>.

какой из них более эффективен в многопоточном режиме? Делаете это, или просто используете итератор queue<> и блокируете его, используя критическую секцию или другой мьютекс.

Я знаю, просто делайте тести отметьте, что это ответит на мой вопрос, но мне нужно знать причину, по которой один должен быть быстрее другого.

1 Ответ

3 голосов
/ 26 января 2011

Если вы находитесь в многопоточной среде и вы нажимаете / выталкиваете из очереди, чтобы проверить это, не увидят ли другие потоки неточные данные, если вы переключаетесь между операциями выталкивания и выталкивания? И другой поток может оттолкнуть другой объект, поэтому первый поток может его пропустить ... и т. Д.

Это слишком сложно, слишком чревато условиями гонки. При выполнении итерации вам придется заблокировать очередь, чтобы гарантировать точность данных.

В этот момент возникает вопрос: быстрее ли заблокировать очередь и использовать итератор, или заблокировать очередь и многократно выдвигать / толкать? Я думаю, вы можете догадаться, какой вариант лучше здесь: -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...