首页 > 解决方案 > STL 字符串中止的析构函数

问题描述

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

 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 时线程安全吗?预计析构函数在这里中止吗?

标签: c++stringstlthread-safety

解决方案


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

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

f 相同,并用字符串定义m(type )。std::mutex


推荐阅读