Как я могу защитить вектор с помощью мьютекса? - PullRequest
3 голосов
/ 11 августа 2011

Я работаю над созданием сервера C ++, который принимает несколько разных взаимодействующих клиентов, и я использую векторы, чтобы отслеживать их всех по отдельности.Однако я понял, что из-за большого количества запущенных потоков существует небольшая вероятность того, что вектор может быть прочитан и записан одновременно двумя потоками.Есть ли быстрый и безопасный способ добавить к ним мьютекс или что-то еще, чтобы он ожидал, пока все чтения не будут выполнены, пока другая функция не добавит к нему?Невыполнение этого требования может испортить протокол и, возможно, даже привести к сбою сервера.

У меня была идея создать глобальную переменную, которая блокировала бы все чтения для вектора, но я не уверен, что потоки могут бытьвелел взаимно исключать эту переменную (т.е. не менять bool на false и одновременно проверять ее как true, делая механизм бессмысленным).

Я использую Windows 7 (Visual Studio 2010 Pro).Спасибо за любой совет!

Ответы [ 2 ]

5 голосов
/ 11 августа 2011

Самое быстрое решение - заменить std::vector на concurrent_vector.Этот класс имитирует интерфейс std::vector, но является поточно-ориентированным для одновременного чтения и записи.

Однако это сделает код непереносимым, поскольку класс concurrent_vector является частью библиотеки библиотеки параллельных шаблонов Microsoft , а не стандартной библиотеки C ++.Если вы хотите сохранить переносимость, вам придется использовать Boost.Mutex (поскольку VS2010 не поддерживает std::mutex), чтобы получить эксклюзивный доступ к вектору из каждого потока.Использование глобальной переменной для предотвращения одновременного доступа бесполезно.

1 голос
/ 11 августа 2011

Поскольку вы используете VS2010, вы должны использовать Concurrency::concurrent_vector. Но имейте в виду, что у этого класса есть ограничения, и он не является полностью поточно-ориентированным. Вы можете использовать Concurrency::critical_section или Concurrency :: reader_writer_lock . Блокировка чтения-записи обеспечит хорошую производительность, когда число операций чтения превышает количество операций записи. Вы также можете использовать Windows родные блокировки Reader-writer , но они поддерживаются только в Windows Vista и выше.

...