Деструктор строки STL прервать - PullRequest
0 голосов
/ 05 ноября 2018

У меня есть многопоточная программа, где я забыл использовать мьютекс. Однажды программа прервалась со следующей трассировкой стека:

 T abort
 T __libc_message
 t malloc_printerr
 T free
 T operator delete(void*)
 W std::basic_string<char, std::char_traits<char>, std::allocator<char>>::~basic_string()`

Я использовал компилятор gnu c ++ 4.4.3 (в Ubuntu 10.04). Правда ли, что такое поведение может быть из-за использования строки, как в следующем примере. В действительности все гораздо сложнее, но я хочу знать, может ли следующий простой код вызвать такой прерывание.

  1. Поток, который прерывается, когда вызывается деструктор строки копирования:

    void f()
    {
        std::string s = someglobalstring;
    }
    
  2. Нить, которая изменяет строку:

    void g()
    {
         someglobalstring = newcontent;
    }
    

Вопросы: Являются ли новые реализации C ++ поточно-ориентированными с чтением и записью std :: string? Ожидается ли, что деструктор прерывает работу здесь?

1 Ответ

0 голосов
/ 05 ноября 2018

Строки не являются потокобезопасными. Если вы хотите сделать это, используйте std::mutex при доступе к вашей строке.

void g()
{
    std::lock_guard<std::mutex> lock(m);
    someglobalstring = newcontent;
}

То же самое для f, и определите m (тип std::mutex) со строкой.

...