Отключение COW в GCC
Я уже давно знаю, что GCC использует COW (Copy-On-Write) дляstd::string
, делая невозможным использованиеstd::string
в многопоточной программе. Но, насколько мне известно, C ++ 11 запрещает реализации использовать COW, потому что потоки теперь определены стандартом, и семантика перемещения в значительной степени устарела, так или иначе, потребность в COW.
Теперь GCC 4.6 в значительной степени реализует стандарт C ++ 11. Тем не менее, кажется, что реализацияstill используя COW семантику. На это обратили мое внимание случайные загадочные ошибки сегмента в многопоточном приложении, которое я написал. Я подтвердил, что это на самом деле проблема COW с помощью следующего тестового кода:
#include <iostream>
#include <string>
#include <cassert>
#include <thread>
using namespace std;
int main()
{
std::string orig = "abc";
std::string copy = orig;
std::cout << (void*) orig.data() << ", " << (void*) copy.data() << endl;
assert(orig.data() == copy.data());
}
Edit: Обратите внимание на включение<thread>
здесь заголовок, доказывающий, что это программа на C ++ 11. И здесьссылка на ideone подтверждение того, что я говорю (по крайней мере, для GCC 4.5.1, который использует ideone)
Я не помню почему, но по какой-то причине у меня сложилось впечатление, чтоstd=c++0x
Флаг устранит семантику COW, но это не так. Утверждение в приведенном выше коде успешно,even with the --std=c++0x flag. Таким образом, в основном, с GCC 4.6,std::string
все еще непригоден для использования в многопоточном приложении.
Есть ли способ отключить семантику COW? Или мне нужно использоватьstd::vector<char>
пока GCC это не исправит?