Я разрабатываю многопоточную программу, запущенную на Linux (скомпилированную с g++ 4.3), и если вы немного поискаете, вы найдете много страшных историй о std::string, которые не являются потокобезопасными с GCC. Это, предположительно, связано с тем, что внутри он использует copy-on-write, который наносит ущерб инструментам вроде Helgrind.
Я сделал небольшую программу, которая копирует одну строку в другую строку, и если вы проверите обе строки, они оба будут иметь один и тот же внутренний указатель _M_p. Когда одна строка изменена, указатель изменяется, поэтому материал "копировать-на-запись" работает нормально.
Я беспокоюсь о том, что происходит, если я разделяю строку между двумя потоками (например, передавая ее как объект в потоковом потоке данных между двумя потоками). Я уже пробовал компиляцию с параметром "-pthread", но это, похоже, не имеет большого значения. Поэтому мой вопрос:
- Есть ли способ заставить std::string быть потокобезопасным? Я бы не возражал, если для этого было отключено поведение "копирование по-записи".
- Как другие люди решили это? Или я параноик?
Я не могу найти окончательного ответа, поэтому надеюсь, что вы, ребята, можете мне помочь..
Edit:
Ничего себе, за это очень много ответов. Спасибо! Я обязательно буду использовать решение Jack, когда я хочу отключить COW. Но теперь главный вопрос: действительно ли мне нужно отключить COW? Или это "бухгалтерия", сделанная для поточной безопасности COW? В настоящее время я просматриваю источники libstdС++, но это займет довольно много времени, чтобы выяснить...
Изменить 2
OK просмотрел исходный код libstdС++, и я нашел что-то вроде этого в libstd ++ - v3/include/bits/basic_string.h:
_CharT*
_M_refcopy() throw()
{
#ifndef _GLIBCXX_FULLY_DYNAMIC_STRING
if (__builtin_expect(this != &_S_empty_rep(), false))
#endif
__gnu_cxx::__atomic_add_dispatch(&this->_M_refcount, 1);
return _M_refdata();
} // XXX MT
Итак, есть что-то там об атомных изменениях на счетчике...
Заключение
Я отмечаю комментарий sellibitze как ответ здесь, потому что, думаю, мы пришли к выводу, что эта область до сих пор не решена. Чтобы обойти поведение COW, я бы предложил ответить Джеку Ллойду. Спасибо всем за интересное обсуждение!