STL字符串中止的析构函数

时间:2018-11-05 13:04:33

标签: c++ string stl thread-safety

我有一个多线程程序,我忘了使用互斥锁。一次,程序因以下堆栈跟踪而中止:

 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 :(得分:2)

字符串不是线程安全的。如果要执行此操作,请在访问字符串时使用std::mutex

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

与f相同,并使用字符串定义m(类型std::mutex)。