Отключение 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 это не исправит?

Ответы на вопрос(1)

Ваш ответ на вопрос