Когда объекты потока c ++ используют мьютексы? - PullRequest
2 голосов
/ 09 марта 2010

В ответе на этот вопрос ovanes говорится:

Обратите внимание, что boost :: lexical_cast намного медленнее, чем atoi. Я также использую это очень часто в некритический код производительности. проблема с lexical_cast в том что использует stringstream для конвертации. Если вы работаете в многопоточном окружение любого потока класса из стандартный lib будет использовать блокировки на мьютексе для каждого вставляемого символа, даже если объект потока используется из одна нить. Ваш номер состоит из 17 символов будут задействованы 17 мьютексов блокируется при вводе в поток. - ованы 22 июня в 11: 59

Возникает вопрос, когда <iostream> объекты блокируют мьютекс? Это верно и для объектов из <sstream>? Если это так, можно ли это предотвратить?

Ответы [ 2 ]

4 голосов
/ 09 марта 2010

Текущий стандарт C ++ (C ++ 03) не содержит ничего о многопоточности.

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

0 голосов
/ 09 марта 2010

Проблема с string_stream заключается в том, что он довольно тяжелый. И это не имеет отношения к мьютексам.

И я объясню почему:

  • stringstream использует универсальный интерфейс для доступа к базовому буферу, так же как и для файлов или для доступа к консоли: набор виртуальных функций. Это медленнее, чем итерация по char *
  • он использует информацию о локали, поэтому вы можете фактически проанализировать строку, которая зависит от типа разделителей тысяч или разных типов цифр, которые выбираются для другого класса в интерфейсе локали.
  • И, наконец, он вызывает atoi для преобразования строки в число.

lexical_cast является очень мощным, потому что он позволяет разыгрывать любое значение, а не целое число, как в случае с atoi, но с силой приходит цена.

Во-вторых, я не думаю, что любая реализация string_buffer использует мьютексы. Файловый поток имеет смысл, но не строковый поток.

...