我有一个多线程程序,我忘了使用互斥锁。一次,程序因以下堆栈跟踪而中止:
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上)。确实如此,此行为可能是由于使用字符串引起的,如以下示例所示。实际上,它要复杂得多,但是我想知道下面的简单代码是否会导致这种中止。
在调用复制字符串的析构函数时中止的线程:
void f()
{
std::string s = someglobalstring;
}
修改字符串的线程:
void g()
{
someglobalstring = newcontent;
}
问题: 较新的C ++实现在读取和写入std :: string时是否安全吗? 预计析构函数会在此处终止吗?
答案 0 :(得分:2)
字符串不是线程安全的。如果要执行此操作,请在访问字符串时使用std::mutex
。
void g()
{
std::lock_guard<std::mutex> lock(m);
someglobalstring = newcontent;
}
与f相同,并使用字符串定义m
(类型std::mutex
)。