std :: locale, вызывающая ошибки с Helgrind - PullRequest
0 голосов
/ 22 декабря 2018

При профилировании моей программы с Helgrind я заметил, что получаю много ошибок, подобных:

==8347== Possible data race during read of size 4 at 0x53C47A0 by thread #2
==8347== Locks held: none
==8347==    at 0x50E4E68: std::locale::locale() (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21)
==8347==    by 0x515B1DE: std::__cxx11::basic_stringstream<char, std::char_traits<char>, std::allocator<char> >::basic_stringstream(std::_Ios_Openmode) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21)

и

==8347== This conflicts with a previous write of size 4 by thread #1
==8347== Locks held: 1, at address 0xFFEFFF638
==8347==    at 0x50E3115: std::locale::~locale() (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21)

Так что мне было интересно, идет ли этобыть проблемой, и если так, я могу это исправить?Я знаю, как подавлять ошибки с помощью Valgrind, но я не уверен, стоит ли мне волноваться.

1 Ответ

0 голосов
/ 22 декабря 2018

Как говорит std::locale docs:

Внутренне, объект локали реализован так, как если бы это был указатель с подсчетом ссылок на массив (индексируемый std::locale::id) указателей с подсчетом ссылок на фасеты: при копировании локали копируется только один указатель и увеличивается число подсчетов ссылок.Чтобы поддерживать стандартные гарантии безопасности потоков библиотеки C ++ (операции над различными объектами всегда потокобезопасны), и счетчик ссылок на локаль, и счетчик ссылок на каждый фасет обновляются потокобезопасным способом, подобно std::shared_ptr.

Так что я бы сказал, что вам, вероятно, не о чем беспокоиться, но, с другой стороны, если вы выделяете (не просто читаете) указатель со счетчиком ссылок (например, shared_ptr) в потоке, который вылучше использовать блокировку для предотвращения неправильного перераспределения.

Вот хорошее объяснение этого: std :: shared_ptr безопасность потока

...